这两天折腾了一下java的文件上传与下载的,主要使用了io相关的类,关键是这3个类的使用File,InputStream,OutputStream。java.io.File创建文件或文件夹,java.io.InputStream读取File里面的数据,java.io.OutputStream将InputStream里面的数据导出或写入到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();
}
}
}