Spring MVC文件上传下载的三种方式

最近在忙一些毕业设计和毕业论文的事,所以没有将过多的时间投入在博客中,今天才有时间记录一下在Spring MVC中的文件上传的三种方式。
首先,不管是哪一种的上传方式,都需要在SpringMVC的配置文件中配置文件上传的相关参数。
代码如下:


<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
     
     <property name="maxUploadSize" value="104857600" />
     <property name="maxInMemorySize" value="4096" />
     <property name="defaultEncoding" value="UTF-8">property>
bean>

然后是前台上传页面的三种写法。
代码如下:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title heretitle>
head>
<body>

<form name="serForm" action="/SpringMVC006/fileUpload" method="post"  enctype="multipart/form-data">
<h1>采用流的方式上传文件h1>
<input type="file" name="file">
<input type="submit" value="upload"/>
form>

<form name="Form2" action="/SpringMVC006/fileUpload2" method="post"  enctype="multipart/form-data">
<h1>采用multipart提供的file.transfer方法上传文件h1>
<input type="file" name="file">
<input type="submit" value="upload"/>
form>

<form name="Form2" action="/SpringMVC006/springUpload" method="post"  enctype="multipart/form-data">
<h1>使用spring mvc提供的类的方法上传文件h1>
<input type="file" name="file">
<input type="submit" value="upload"/>
form>
body>
html>

接着,是后台controller的三种写法。代码如下:
第一种:

    /*
     * 通过流的方式上传文件
     * @RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象
     */
    @RequestMapping("fileUpload")
    public String  fileUpload(@RequestParam("file") CommonsMultipartFile file) throws IOException {


        //用来检测程序运行时间
        long  startTime=System.currentTimeMillis();
        System.out.println("fileName:"+file.getOriginalFilename());

        try {
            //获取输出流
            OutputStream os=new FileOutputStream("E:/"+new Date().getTime()+file.getOriginalFilename());
            //获取输入流 CommonsMultipartFile 中可以直接得到文件的流
            InputStream is=file.getInputStream();
            int temp;
            //一个一个字节的读取并写入
            while((temp=is.read())!=(-1))
            {
                os.write(temp);
            }
           os.flush();
           os.close();
           is.close();

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        long  endTime=System.currentTimeMillis();
        System.out.println("方法一的运行时间:"+String.valueOf(endTime-startTime)+"ms");
        return "/success"; 
    }

第二种:

    /*
     * 采用file.Transto 来保存上传的文件
     */
    @RequestMapping("fileUpload2")
    public String  fileUpload2(@RequestParam("file") CommonsMultipartFile file) throws IOException {
         long  startTime=System.currentTimeMillis();
        System.out.println("fileName:"+file.getOriginalFilename());
        String path="E:/"+new Date().getTime()+file.getOriginalFilename();

        File newFile=new File(path);
        //通过CommonsMultipartFile的方法直接写文件(注意这个时候)
        file.transferTo(newFile);
        long  endTime=System.currentTimeMillis();
        System.out.println("方法二的运行时间:"+String.valueOf(endTime-startTime)+"ms");
        return "/success"; 
    }

第三种:

    /*
     *采用spring提供的上传文件的方法
     */
    @RequestMapping("springUpload")
    public String  springUpload(HttpServletRequest request) throws IllegalStateException, IOException
    {
         long  startTime=System.currentTimeMillis();
         //将当前上下文初始化给  CommonsMutipartResolver (多部分解析器)
        CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(
                request.getSession().getServletContext());
        //检查form中是否有enctype="multipart/form-data"
        if(multipartResolver.isMultipart(request))
        {
            //将request变成多部分request
            MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;
           //获取multiRequest 中所有的文件名
            Iterator iter=multiRequest.getFileNames();

            while(iter.hasNext())
            {
                //一次遍历所有文件
                MultipartFile file=multiRequest.getFile(iter.next().toString());
                if(file!=null)
                {
                    String path="E:/springUpload"+file.getOriginalFilename();
                    //上传
                    file.transferTo(new File(path));
                }

            }

        }
        long  endTime=System.currentTimeMillis();
        System.out.println("方法三的运行时间:"+String.valueOf(endTime-startTime)+"ms");
    return "/success"; 
    }

这里推荐大家使用第三种,因为这是Spring提供的上传方式,相比较前两种,这种方式效率更高,功能更多。

最后,在提供一种文件下载的方式。
前台为了测试,我直接传入参数是文件名称,代码如下:

<a href="download.do?fileName=2016082312271111111.jpg">下载a>  

后台代码如下:

@RequestMapping("/download")  
    public String download(String fileName, HttpServletRequest request,  
            HttpServletResponse response) {  
        response.setCharacterEncoding("utf-8");  
        response.setContentType("multipart/form-data");  
        response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);  
        try {  
            String path = request.getSession().getServletContext().getRealPath  
                    ("image")+File.separator;  
            InputStream inputStream = new FileInputStream(new File(path + fileName));  
            OutputStream os = response.getOutputStream();  
            byte[] b = new byte[2048];  
            int length;  
            while ((length = inputStream.read(b)) > 0) {  
                os.write(b, 0, length);  
            }  
             // 这里主要关闭。  
            os.close();  
            inputStream.close();  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
            //  返回值要注意,要不然就出现下面这句错误!  
            //java+getOutputStream() has already been called for this response  
        return null;  
    }  

至此,一个完整的文件上传和下载就成功了。

你可能感兴趣的:(spring,mvc,文件上传下载)