码迷,mamicode.com
首页 > 编程语言 > 详细

java文件上传-使用apache-fileupload组件

时间:2017-08-07 00:21:24      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:public   获取   post   enc   group   http   内存   jsp   ima   

 

目前文件上传的(框架)组件:Apache----fileupload 、Orialiy – COS – 2008() 、Jsp-smart-upload – 200M。

用fileupload上传文件:

需要导入第三方包:

       Apache-fileupload.jar – 文件上传核心包。

       Apache-commons-io.jar – 这个包是fileupload的依赖包。同时又是一个工具包。

使用springmvc,解决烦人的post乱码问题,新建maven项目:

技术分享

maven依赖:

<dependency>
    <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>${commons-fileupload.version}</version>
</dependency>
<dependency>
     <groupId>commons-io</groupId>
     <artifactId>commons-io</artifactId>
      <version>${commons-io.version}</version>
</dependency>
版本:

<commons-io.version>1.3.2</commons-io.version>
<commons-fileupload.version>1.3.1</commons-fileupload.version>

 

 

核心类:

       DiskFileItemFactory – 设置磁盘空间,保存临时文件。只是一个具类。

       ServletFileUpload  - 文件上传的核心类,此类接收request,并解析reqeust

  ServletFileUpload.parseRequest(request);  --List<FileItem>   解析request

       一个FileItem就是一个标识分隔符开始 到结束。如下图:

技术分享

 

查看DiskFileItemFactory源代码,可知

If not otherwise configured, the default configuration values are as
 follows:
   Size threshold is 10KB.
   Repository is the system default temp directory, as returned by
   System.getProperty("java.io.tmpdir")

 可知,如果不设置临时目录,会保存在默认的临时目录-  System.getProperty("java.io.tmpdir");这个目录正是windows系统的临时文件存放目录,通过环境变量,可找到这个目录

技术分享技术分享

这里存放着许多临时文件。

 controller:

package com.lhy.upload.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 
 * DiskFileItemFactory:设置磁盘空间,保存临时文件,只是一个工具类。
 * 构造器 DiskFileItemFactory(int sizeThreshold, File repository):
 *     sizeThreshold:
 *         设置缓存保存(内存)保存多少字节数据,默认10K。
 *         如果一个文件没有大于10K,则直接使用内存,直接保存成文件就可以了。
 *         如果一个文件大于10K,就需要将文件先保存到临时文件中去。
 *     repository:
 *         临时目录的位置。
 * 
 * 
 * ServletFileUpload:文件上传核心类,接收request 并解析。
 *
 */
@RequestMapping("/upload")
@Controller
public class UploadController {
    
    @RequestMapping("uploadFile")
    public void uploadFile(HttpServletRequest request,HttpServletResponse response){
        //获取tomcat下的up目录的路径   
        String path = request.getSession().getServletContext().getRealPath("/up");
        //1,声明DiskFileItemFactory工厂类,用于在指定磁盘上设置一个临时目录
        DiskFileItemFactory disk = new DiskFileItemFactory(1024*10,new File("F:/temp"));
        //2,声明ServletFileUpload,接收上边的临时文件。也可以默认值
        ServletFileUpload up = new ServletFileUpload(disk);
        //3,解析request
        try {
            List<FileItem> list = up.parseRequest(request);
            //如果就一个文件,
            FileItem file = list.get(0);
            //获取文件名:
            String fileName = file.getName();
            //获取文件的类型:
            String fileType = file.getContentType();
            //获取文件的字节码:
            InputStream in = file.getInputStream();
            //文件大小
            int size = file.getInputStream().available();
            //声明输出字节流
            OutputStream out = new FileOutputStream(path+"/"+fileName);
            //文件copy
            byte[] b = new byte[1024];
            int len = 0;
            while((len=in.read(b))!=-1){
                out.write(b, 0, len);
            }
            out.flush();
            out.close();
            
            //删除上传生成的临时文件
            file.delete();
            
            //显示数据
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter pw = response.getWriter();
            pw.println("文件名:"+fileName);
            pw.println("文件类型:"+fileType);
            pw.println("<br/>文件大小(byte):"+size);
        } catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

上传文件:

技术分享

临时目录:

技术分享

服务端:

技术分享

响应:

技术分享

实际项目中都是有文件服务器的,公司一般都提供了上传到文件服务器接口,有的是上传一个file类型,有的是流。

多文件上传:和单文件一样

表单:

技术分享

controller:

/**
     * 多文件上传
     * @param request
     * @param response
     */
    @RequestMapping("uploadMultipart")
    public void uploadMultipart(HttpServletRequest request,HttpServletResponse response){
        //获取tomcat下的up目录的路径   
        String path = request.getSession().getServletContext().getRealPath("/up");
        //1,声明DiskFileItemFactory工厂类,用于在指定磁盘上设置一个临时目录
        DiskFileItemFactory disk = new DiskFileItemFactory(1024*10,new File("F:/temp"));
        //2,声明ServletFileUpload,接收上边的临时文件。也可以默认值
        ServletFileUpload up = new ServletFileUpload(disk);
        //3,解析request
        try {
            List<FileItem> list = up.parseRequest(request);
            for (FileItem file : list) {
                //获取文件名:
                String fileName = file.getName();
                //获取文件的类型:
                String fileType = file.getContentType();
                //获取文件的字节码:
                InputStream in = file.getInputStream();
                //使用工具类
                FileUtils.writeByteArrayToFile(new File(path+"/"+fileName), file.get());
                file.delete();
            }
        } catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

测试,上传3张图片:

技术分享

技术分享

 

java文件上传-使用apache-fileupload组件

标签:public   获取   post   enc   group   http   内存   jsp   ima   

原文地址:http://www.cnblogs.com/lihaoyang/p/7295434.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!