实现Android客户端通过Servlet上传文件到服务器可以通过如下步骤:
- 在Android客户端编写上传文件的代码,这里我们可以使用库
Okhttp
来提供网络请求和上传文件的能力。首先在gradle中添加依赖:
implementation 'com.squareup.okhttp3:okhttp:4.9.1'
- 在Android客户端的代码中,编写上传文件的代码,如下所示:
public static final MediaType MEDIA_TYPE_MARKDOWN
= MediaType.get("text/x-markdown; charset=utf-8");
public void postFile(File file) throws Exception {
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", file.getName(),
RequestBody.create(MEDIA_TYPE_MARKDOWN, file))
.build();
Request request = new Request.Builder()
.url("http://yourserver.com/upload")
.post(requestBody)
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
System.out.println(response.body().string());
}
上述代码创建了OkHttpClient
对象,然后构建一个RequestBody
对象,通过该对象,我们可以上传文件到服务器。在上传文件时,我们需要指定上传的文件类型、文件名和文件内容。这里我们上传的文件名称是"file"。
- 在服务器端编写Servlet代码用于接收文件上传请求。代码如下所示:
@WebServlet(name = "UploadHandleServlet", urlPatterns = "/upload")
@MultipartConfig
public class UploadHandleServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Collection<Part> parts = request.getParts();
for (Part part : parts) {
if (part.getName().equals("file")) {
String fileName = getFileName(part);
String filePath = "upload/" + fileName;
part.write(filePath);
}
}
}
private String getFileName(Part part) {
String header = part.getHeader("Content-Disposition");
String result = header.substring(header.indexOf("filename=\"") + 10, header.lastIndexOf("\""));
return result;
}
}
这里我们使用了@MultipartConfig
注解来告知Servlet容器上传文件的处理。当客户端发送POST请求到这个Servlet时,我们通过request.getParts()
方法获取所有上传的参数,在从中筛选出我们所关注的上传文件,然后通过part.write(filePath)
方法写入到服务器指定的路径。
-
在服务端运行上述代码,客户端上传文件时即可把文件上传到服务器。
-
示例一:上传文字文件
执行如下代码即可上传文件:
File file = new File("README.md");
postFile(file);
如上述postFile()
方法所示,我们上传的文件是"README.md",这个文件路径是在Android客户端的根目录下。在Servlet端,我们上传的参数是"file",这个参数名称需要与Android客户端一致。
- 示例二:上传图片文件
如下所示,可以上传图片文件:
File file = new File("test.jpg");
postFile(file);
上传图片的方法和上传文字文件的方法很相似,只需要把文件类型设置为"image/jpeg"即可:
public static final MediaType MEDIA_TYPE_JPEG = MediaType.get("image/jpeg");
public void postFile(File file) throws Exception {
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", file.getName(),
RequestBody.create(MEDIA_TYPE_JPEG, file))
.build();
Request request = new Request.Builder()
.url("http://yourserver.com/upload")
.post(requestBody)
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
System.out.println(response.body().string());
}
当文件类型为图片时,我们需要指定文件类型为"image/jpeg"。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:android通过servlet上传文件到服务器 - Python技术站