实现方式:
- 首先,需要在Android应用中添加一个上传文件的按钮,并在按钮的点击事件中编写上传操作的代码。
- 然后,需要使用Java中的HttpURLConnection来进行文件上传操作。具体实现如下:
public void uploadFile(String filePath, String serverUrl) {
try {
// 获取文件名
String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
// 设置请求参数
URL url = new URL(serverUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + BOUNDARY);
// 设置请求头
StringBuilder sb = new StringBuilder();
sb.append("--" + BOUNDARY + "rn");
sb.append("Content-Disposition: form-data;name="file";filename="" + fileName + ""rn");
sb.append("Content-Type:application/octet-streamrnrn");
byte[] headerBytes = sb.toString().getBytes("UTF-8");
// 读取文件内容
FileInputStream fis = new FileInputStream(filePath);
OutputStream out = conn.getOutputStream();
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
// 写入结束标识
byte[] footBytes = ("rn--" + BOUNDARY + "--rn").getBytes("UTF-8");
// 关闭流
fis.close();
out.flush();
out.close();
// 获取请求结果
int resCode = conn.getResponseCode();
if (resCode == HttpURLConnection.HTTP_OK) {
InputStream is = conn.getInputStream();
int ch;
StringBuilder sbResponse = new StringBuilder();
while ((ch = is.read()) != -1) {
sbResponse.append((char) ch);
}
is.close();
String response = sbResponse.toString();
}
} catch (Exception e) {
e.printStackTrace();
}
}
其中,BOUNDARY是请求分隔符,可以自由定义。
- 调用uploadFile方法来上传文件:
String filePath = "/sdcard/test.jpg";
String serverUrl = "http://example.com/upload.php";
uploadFile(filePath, serverUrl);
在使用时需要注意,上传文件需要访问网络,因此需要在AndroidManifest.xml中添加以下权限:
<uses-permission android:name="android.permission.INTERNET" />
另外,需要注意文件大小的限制,如果上传的文件过大可能会引起内存溢出,需要特别处理。
要将文件上传到服务器,需要执行以下步骤:
- 在 Android 应用中创建一个表单,在表单中包含要上传的文件和相关信息。
- 使用 HttpURLConnection 或 OkHTTP 等 HTTP 库与服务器建立连接。
-
将表单作为 POST 请求发送到服务器。在请求中,将包含以下信息:
- 请求方法为 POST
- 请求头部包含 Content-Type: multipart/form-data
- 请求体包含文件及其它相关信息
- 服务器接收到请求后,解析请求体中的文件和相关信息,然后将文件保存在服务器磁盘上。
要实现多文件上传,只需要在表单中添加多个文件域即可。
以下是一个使用 HttpURLCOnnection 进行文件上传的示例代码:
private int uploadFile(String sourceFileUri) {
String fileName = sourceFileUri;
HttpURLConnection conn = null;
DataOutputStream dos = null;
String lineEnd = "rn";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1 * 1024 * 1024;
File sourceFile = new File(sourceFileUri);
if (!sourceFile.isFile()) {
Log.e("uploadFile", "Source File not exist :" + sourceFileUri);
return 0;
}
else
{
try {
// open a URL connection to the server
FileInputStream fileInputStream = new FileInputStream(sourceFile);
URL url = new URL("SERVER_API_ENDPOINT");
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true); // Allow Inputs
conn.setDoOutput(true); // Allow Outputs
conn.setUseCaches(false); // Don't use a Cached Copy
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("ENCTYPE", "multipart/form-data");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
conn.setRequestProperty("uploaded_file", fileName);
dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name="uploaded_file";filename=""
+ fileName + """ + lineEnd);
dos.writeBytes(lineEnd);
// create a buffer of maximum size
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// read file and write it into form...
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
dos.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
// send multipart form data necesssary after file data...
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
// Responses from the server (code and message)
serverResponseCode = conn.getResponseCode();
String serverResponseMessage = conn.getResponseMessage();
Log.i("uploadFile", "HTTP Response is : " + serverResponseMessage + ": " + serverResponseCode);
// close the streams //
fileInputStream.close();
dos.flush();
dos.close();
} catch (MalformedURLException ex) {
ex.printStackTrace();
Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
} catch (Exception e) {
e.printStackTrace();
Log.e("Upload file to server Exception", "Exception : " + e.getMessage(), e);
}
return serverResponseCode;
} // End else block
}
发布者:luotuoemo,转转请注明出处:https://www.jintuiyun.com/155228.html