spring mvc文件上传与下载

这两天折腾了一下java的文件上传与下载的,主要使用了io相关的类,关键是这3个类的使用FileInputStreamOutputStreamjava.io.File创建文件或文件夹,java.io.InputStream读取File里面的数据,java.io.OutputStreamInputStream里面的数据导出或写入到File

看下实验中引入的类就知道了

import java.io.BufferedInputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.io.UnsupportedEncodingException;

import java.net.HttpURLConnection;

import java.net.URL;

import java.net.URLEncoder;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.multipart.commons.CommonsMultipartFile;

 

对的,我们使用了apache commons http://commons.apache.org/下面的两个组件,需要添加到项目maven依赖pom.xml里面

<dependency>

    <groupId>commons-fileupload</groupId>

    <artifactId>commons-fileupload</artifactId>

    <version>1.2.2</version>

</dependency>

<dependency>

    <groupId>commons-io</groupId>

    <artifactId>commons-io</artifactId>

    <version>2.4</version>

</dependency>

 

另外dispatcher-servlet.xml需要添加对文件上传的支持

<bean id="multipartResolver"

    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

    <property name="maxUploadSize" value="104857600" />

</bean>

 

开始我们的实验

实验环境:eclipse+spring+velocity

第一步、新建文件上传下载页面

1、 上传页面fileUploadForm.vm

 <form action="#springUrl('/file/uploadFile.htm')" enctype="multipart/form-data"   method="post">

<table border="1">

    <tr>

       <td>

上传文件

        </td>

    </tr>

    <tr>

       <td>

           <input type="file" name="fileUpload" />

        </td>

    </tr>

    <tr>

       <td colspan="2">

           <input type="submit" value="上传"/>

        </td>

    </tr>

 <tr><td>结果:</td><td>$!result</td></tr>  

</table>

</form>

 

2、 下载页面fileDownloadForm.vm

 <form action="#springUrl('/file/downloadFile.htm')" enctype="multipart/form-data"   method="post">

<table border="1">

    <tr>

       <td>

下载文件

        </td>

    </tr>

    <tr>

       <td>

           <input type="text" name="fileName" value="http://minishua.com/android/m.apk" />

        </td>

    </tr>

    <tr>

       <td colspan="2">

           <input type="submit" value="下载"/>

        </td>

    </tr>

 <tr><td>结果:</td><td>$!result</td></tr>  

</table>

</form>

 

 

第二步、创建文件上传下载控制器FileAction.java

实验过程中,出现了,中文名称的文件上传后名称变成乱码,还有中文名称的文件不能下载的问题,在本实验中都一一得到了解决。这个大家需要注意~

 

 /**

 * spring mvc文件上传与下载

 */

package com.figo.onlinemarket.web.action;

import java.io.BufferedInputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.io.UnsupportedEncodingException;

import java.net.HttpURLConnection;

import java.net.URL;

import java.net.URLEncoder;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.multipart.commons.CommonsMultipartFile;

/**

 * 20130307

 *

 @author zhuzhifei spring mvc文件上传与下载

 */

@Controller

public class FileAction {

    /**

     跳转到文件上传页面

     *

     @param request

     @param model

     @return

     */

    @RequestMapping(value = "/file/toUploadFile.htm")

    public String toUploadFile(HttpServletRequest request, ModelMap model) {

       return "business/common/fileUploadForm";

    }

 

    /**

     文件上传功能

     *

     @param request

     @param response

     @param fileUpload

     @param model

     @return

     */

    @RequestMapping(value = "/file/uploadFile.htm")

    public String uploadFile(HttpServletRequest request,

           HttpServletResponse response,

           @RequestParam("fileUpload") CommonsMultipartFile fileUpload,

           ModelMap model) {

       try {

           if (!fileUpload.isEmpty()) {

              // String saveDir =

              // request.getSession().getServletContext().getRealPath("/upload");//相对路径

              // 测试路径

              String saveDir = "d:\\upload\\";

              // 为了保证目录存在,如果没有则新建该目录

              File testdir = new File(saveDir);

              if (!testdir.exists()) {

                  testdir.mkdirs();

              }

              // 获取文件信息

              FileItem fileItem = fileUpload.getFileItem();

              // 解决中文名称的文件上传后文件名乱码问题

              String fullFileName = new String(fileItem.getName().getBytes(

                     "ISO8859-1"), "utf-8");

              String fileName = fullFileName.substring(fullFileName

                     .lastIndexOf("\\") + 1);

              // 新建一个文件

              File file = new File(saveDir + fileName);

              try {

                  // 将上传的文件写入新建的文件中

                  fileUpload.getFileItem().write(file);

              catch (Exception e) {

                  e.printStackTrace();

              }

              model.put("result""成功");

           }

       catch (Exception e) {

           e.printStackTrace();

       }

 

       return "business/common/fileUploadForm";

    }

 

    /**

     跳转到文件下载页面

     *

     @param request

     @param model

     @return

     */

    @RequestMapping(value = "/file/toDownloadFile.htm")

    public String toDownLoadFile(HttpServletRequest request, ModelMap model) {

       return "business/common/fileDownloadForm";

    }

 

    /**

     文件下载功能

     *

     @param request

     @param response

     @param model

     */

    @RequestMapping(value = "/file/downloadFile.htm")

    public void downloadFile(HttpServletRequest request,

           HttpServletResponse response, ModelMap model) {

 

       // 一、下载本地路径的文件

       try {

           // response.setHeader("Content-Disposition", "attachment;fileName="

           // + fileNameNew.substring(fileNameNew.lastIndexOf("\\")+1));

           // pc=req.getServletContext().getRealPath("/WEB-INF/conf.properties");

           // Configuration rc = new Configuration(pc);//相对路径

           // String dir=rc.getValue("path");

           response.setCharacterEncoding("utf-8");

           response.setContentType("multipart/form-data");

           // String fileNameNew = "D:\\upload\\m.apk";

           String fileNameNew = "D:\\upload\\学习教程.txt";

           // 解决中文名称的文件不能下载的问题

           // begin

           String fileName = URLEncoder.encode(

                  fileNameNew.substring(fileNameNew.lastIndexOf("\\") + 1),

                  "UTF-8");

           if (fileName.length() > 150)// 解决IE 6.0 bug

           {

              fileName = new String(fileName.getBytes("GBK"), "ISO-8859-1");

           }

           response.setHeader("Content-Disposition""attachment;filename="

                  + fileName);

           // end

           File file = new File(fileNameNew);

           // 读取文件数据

           InputStream inputStream = new FileInputStream(file);

           OutputStream outputStream = response.getOutputStream();

           byte[] b = new byte[1024];

           int length;

           while ((length = inputStream.read(b)) > 0) {

              // 将文件数据写出来

              outputStream.write(b, 0, length);

           }

           // 关闭输入输出流

           inputStream.close();

           outputStream.close();

       catch (FileNotFoundException e) {

           e.printStackTrace();

       catch (IOException e) {

           e.printStackTrace();

       }

      

      

       // 二、下载互联网上的文件

       try {

           //destUrl=http://minishua.com/android/m.apk

           String destUrl = "";

           try {

              destUrl = new String(request.getParameter("fileName").getBytes(

                     "ISO-8859-1"), "UTF-8");

           catch (UnsupportedEncodingException e1) {

              e1.printStackTrace();

           }

           String fileName = destUrl.substring(destUrl.lastIndexOf("/") + 1);

           response.setContentType("multipart/form-data");

           // 解决中文名称的文件不能下载的问题

           // begin

           fileName = URLEncoder.encode(fileName, "UTF-8");

           if (fileName.length() > 150)// 解决IE 6.0 bug

           {

              fileName = new String(fileName.getBytes("GBK"), "ISO-8859-1");

           }

           response.setHeader("Content-Disposition""attachment;filename="

                  + fileName);

           // end

           OutputStream fos = null;

           BufferedInputStream bis = null;

           HttpURLConnection httpUrl = null;

           URL url = null;

           byte[] buf = new byte[1024];

           int size = 0;

           // 建立链接

           url = new URL(destUrl);

           httpUrl = (HttpURLConnection) url.openConnection();

           // 连接指定的资源

           httpUrl.connect();

           // 获取网络输入流

           bis = new BufferedInputStream(httpUrl.getInputStream());

           fos = response.getOutputStream();

           // 保存文件

           while ((size = bis.read(buf)) != -1) {

              fos.write(buf, 0, size);

           }

           // 关闭输入输出流和网络链接

           bis.close();

           fos.close();

           httpUrl.disconnect();

       catch (Exception e) {

           // TODO: handle exception

           e.printStackTrace();

       }

 

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值