java web文件上传总结

1、上传的前提

      a、表单的method必须是post
    b、表单的enctype属性必须是multipart/form-data类型的。
    c、表单中提供type="file"类型的上传组件

   注:enctype默认值:application/x-www-form-urlencoded,enctype的作用是告知服务器,请求正文的MIME类型


2、文件上传的原理

    解析请求正文中的内容




3、借助第三方组件实现文件上传

    commons-fileupload组件:
    拷贝jar包:commons-fileupload.jar   commons-io.jar 



4、DiskFileItemFactory:

    a、DiskFileItemFactory类的理解:

           DiskFileItemFactory类是FileItemFactory接口的默认实现,DiskFileItemFactory能创建FileItem实例(FileItem代表一个需要被上传的文件或者表单),如果这个实例包含的内容很小,它就会存放在内存中,否则就存储在硬盘的一个临时文件中。

    b、常用的方法:

       public void setRepository(File repository):设置临时文件的存放目录

    public void setSizeThreshold(int sizeThreshold):设置缓存的大小

5、ServletFileUpload

    使用其parseRequest(HttpServletRequest) 方法可以将通过表单中每一个HTML标签提交的数据封装成一个FileItem对象,然后以List列表的形式返回。
   public List<FileItem> parseRequest(HttpServletRequest request)  

    ServletFileUpload对象的parseRequest()方法用来解析请求,需要根据DiskFileItemFactory对象的属性sizeThreshold和repository来决定将解析得到的数据保存在内存还是临时文件中,如果是临时文件,保存在哪个临时目录中。
例:
   DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
   ServletFileUpload parser = new ServletFileUpload(diskFileItemFactory);    

6、示例代码:

public class UploadServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// 判断用户的提交类型
boolean b = ServletFileUpload.isMultipartContent(request);
if (!b) {
throw new RuntimeException("错误");
}
// 创建DiskFileItemFactory
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
ServletFileUpload parser = new ServletFileUpload(diskFileItemFactory);

List<FileItem> items = null;
try {
items = parser.parseRequest(request);
} catch (Exception e) {
throw new RuntimeException("解析上传内容失败");
}
if (items != null) {
for (FileItem item : items) {
if (item.isFormField()) {
// 普通表单字段
processFormField(item);
} else {
processUpload(item);
}
}
}
out.write("upload successfully!!");
}

private void processUpload(FileItem item) {
try {
String fileName = item.getName();
if (fileName != null) {
fileName = FilenameUtils.getName(fileName);
}
// 去把文件存到服务器的目录中
String storeDirectoryPath = getServletContext().getRealPath(
"/files");
File storeDirectory = new File(storeDirectoryPath);
if (!storeDirectory.exists()) {
storeDirectory.mkdir();
}
item.write(new File(storeDirectory + File.separator + fileName));
} catch (Exception e) {
throw new RuntimeException("faile");
}
}

private void processFormField(FileItem item) {
String fielfName = item.getFieldName();
String fieldValue = item.getString();
System.out.println(fielfName + "::" + fieldValue);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}

}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值