使用Servlet处理文件上传

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上传文件时报空指针异常解决办法

微信扫一扫关注公众号
image.png
点击链接加入群聊

https://jq.qq.com/?_wv=1027&k=5eVEhfN
软件测试学习交流QQ群号:511619105

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值