Servlet 3 以前,Servlet API中没有支持上传功能的API,因此要实现上传功能需要引入第三方工具从POST请求中获得上传的附件或者通过自行处理输入流来获得上传的文件,我们推荐使用Apache的commons-fileupload。
从Servlet 3开始,文件上传变得无比简单,相信看看下面的例子一切都清楚了。
javascript代码如下:
function upload(){
var file = $("#photo").get(0).files[0];
var formData = new FormData();
formData.append("source",file);
$.ajax({
url:"upload/file",
type:"post",
dataType:"json",
cache:false,
data:formData,
contentType:false,
processData:false,
success:function(data){
if(data.result=="success"){
$("#photo2").attr("src",data.url);
$("#filePath").val(data.url);
}
console.log("hello test");
}
});
}
java代码如下:
package com.yzc.servlets;
import java.io.PrintWriter;
import java.util.UUID;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@WebServlet("/upload/file")
@MultipartConfig
public class UploadFileServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void service(HttpServletRequest req, HttpServletResponse resp) {
PrintWriter pw = null;
// 解决响应正文内容包含中文会出现乱码的问题
resp.setContentType("application/json;charset=utf-8");
try {
pw = resp.getWriter();
Part part = req.getPart("source");
// System.out.println(part.getClass());
String cd = part.getHeader("Content-Disposition");
// System.out.println(cd);
// 截取不同类型的文件需要自行判断
String filename = cd.substring(cd.lastIndexOf("=") + 2, cd.length() - 1);
if (part != null && filename.length() > 0) {
String extName = filename.substring(filename.lastIndexOf("."));// .jpg
String uuid = UUID.randomUUID().toString().replace("-", "");
// 新名称
String newName = uuid + extName;// 在这里用UUID来生成新的文件夹名字,这样就不会导致重名
// 用ServletContext对象的getRealPath()方法获得上传文件夹的绝对路径
String savepath = this.getServletContext().getRealPath("/upload");
// 更好的做法是为上传的文件进行重命名(避免同名文件的相互覆盖)
part.write(savepath + "/" + newName);
pw.println("{\"result\":\"success\",\"message\":\"上传成功!\",\"url\":\"upload/" + newName + "\"}");
}
} catch (Exception e) {
e.printStackTrace();
pw.println("{\"result\":\"fail\",\"message\":\"上传失败!\",\"url\":\"\"}");
}
}
}
参考资料
[01] 使用Servlet3.0上传图片,无法使用part.getSubmittedFileName()方法解决
[02] 通过jQuery Ajax使用FormData对象上传文件
[03] Servlet3.0 Part上传文件时报空指针异常解决办法
微信扫一扫关注公众号
点击链接加入群聊
https://jq.qq.com/?_wv=1027&k=5eVEhfN
软件测试学习交流QQ群号:511619105