commons-FileUpload文件上传下载,及中文乱码、IE7路径错误问题解决
2009-03-21 18:53
1106 查看
http://commons.apache.org/fileupload/
下载commons FileUpload. 解压后将.jar文件加入类路径。上传模块有两部分工作要做,首先是JSP页面中用于上传文件的表单:
<form action="FileUpload" method="post" enctype="multipart/form-data">
<input type="file" name="file1"/>
<input type="file" name="file2"/>
<input type="file" name="file3"/>
<input type="submit" name="Submit" value="upload"/>
</form>
这样的表单可以一次最多上传3个文件。之后这个表单提交到一个Servlet,用来读出文件,并写入。
//确保上传路径在本机已存在
String uploadPath = "d:/files/";
System.out.println(uploadPath);
//创建FileItem工厂
DiskFileItemFactory factory=new DiskFileItemFactory();
//设置工厂使用的临时文件
factory.setRepository(new File(uploadPath));
//核心对象
ServletFileUpload upload=new ServletFileUpload();
//设置工厂
upload.setFileItemFactory(factory);
//读取Request中包含的文件
List<FileItem> items=upload.parseRequest(request);
for(FileItem item:items)
{
//解决IE7将上传文件绝对地址作为名称的问题
String[] nameStr=item.getName().split("////");
String name=nameStr[nameStr.length-1];
String value=item.getString();
//isFormField用来去定这个Item是否为表单域,比如其他的input控件,如果不是则进行存储
if(!item.isFormField()){
System.out.println("name:"+name);
System.out.println("contentType:"+item.getContentType());
//新建目标文件
File uploadedFile=new File(uploadPath+name);
//将Item的内容写入
item.write(uploadedFile);
FileInfo fileInfo=new FileInfo();
fileInfo.setName(name);
fileInfo.setPath(uploadPath+name);
fileInfo.setOwner((User)request.getSession().getAttribute("user"));
fileDAO.create(fileInfo);
下载文件用一个Servlet完成:
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
Long id=Long.valueOf(request.getParameter("id"));
FileInfo fileInfo=fileDAO.find(id);
response.setContentType("application/x-msdownload;");
//此行代码是防止中文乱码的关键!!
response.setHeader("Content-disposition","attachment; filename="+new String(fileInfo.getName().getBytes("gb2312"),"iso8859-1"));
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(fileInfo.getPath()));
BufferedOutputStream bos=new BufferedOutputStream(response.getOutputStream());
//新建一个2048字节的缓冲区
byte[] buff=new byte[2048];
int bytesRead;
while((bytesRead=bis.read(buff, 0, buff.length))!=-1)
{
bos.write(buff);
}
if (bis != null)
bis.close();
if (bos != null)
bos.close();
}
下载commons FileUpload. 解压后将.jar文件加入类路径。上传模块有两部分工作要做,首先是JSP页面中用于上传文件的表单:
<form action="FileUpload" method="post" enctype="multipart/form-data">
<input type="file" name="file1"/>
<input type="file" name="file2"/>
<input type="file" name="file3"/>
<input type="submit" name="Submit" value="upload"/>
</form>
这样的表单可以一次最多上传3个文件。之后这个表单提交到一个Servlet,用来读出文件,并写入。
//确保上传路径在本机已存在
String uploadPath = "d:/files/";
System.out.println(uploadPath);
//创建FileItem工厂
DiskFileItemFactory factory=new DiskFileItemFactory();
//设置工厂使用的临时文件
factory.setRepository(new File(uploadPath));
//核心对象
ServletFileUpload upload=new ServletFileUpload();
//设置工厂
upload.setFileItemFactory(factory);
//读取Request中包含的文件
List<FileItem> items=upload.parseRequest(request);
for(FileItem item:items)
{
//解决IE7将上传文件绝对地址作为名称的问题
String[] nameStr=item.getName().split("////");
String name=nameStr[nameStr.length-1];
String value=item.getString();
//isFormField用来去定这个Item是否为表单域,比如其他的input控件,如果不是则进行存储
if(!item.isFormField()){
System.out.println("name:"+name);
System.out.println("contentType:"+item.getContentType());
//新建目标文件
File uploadedFile=new File(uploadPath+name);
//将Item的内容写入
item.write(uploadedFile);
FileInfo fileInfo=new FileInfo();
fileInfo.setName(name);
fileInfo.setPath(uploadPath+name);
fileInfo.setOwner((User)request.getSession().getAttribute("user"));
fileDAO.create(fileInfo);
下载文件用一个Servlet完成:
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
Long id=Long.valueOf(request.getParameter("id"));
FileInfo fileInfo=fileDAO.find(id);
response.setContentType("application/x-msdownload;");
//此行代码是防止中文乱码的关键!!
response.setHeader("Content-disposition","attachment; filename="+new String(fileInfo.getName().getBytes("gb2312"),"iso8859-1"));
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(fileInfo.getPath()));
BufferedOutputStream bos=new BufferedOutputStream(response.getOutputStream());
//新建一个2048字节的缓冲区
byte[] buff=new byte[2048];
int bytesRead;
while((bytesRead=bis.read(buff, 0, buff.length))!=-1)
{
bos.write(buff);
}
if (bis != null)
bis.close();
if (bos != null)
bos.close();
}
相关文章推荐
- Struts2-文件上传下载-解决下载中文乱码问题
- java web 利用 commons-fileupload-1.2 实现文件上传 解决 中文乱码& 非文件属性的读取
- java实现ftp文件上传下载,解决慢,中文乱码,多个文件下载等问题
- Java实现ftp文件上传下载解决慢中文乱码多个文件下载等问题
- Java Web中使用JSPSmartUpload控件实现文件的上传和下载(解决了中文乱码问题)(JSP页面采用GBK编码)
- java web 利用 commons-fileupload-1.2 实现文件上传 解决 中文乱码& 非文件属性的读取
- FTPClient上传和下载文件,中文乱码问题解决
- commons-fileUpload组件解决文件上传乱码问题
- 【java】[文件上传jar包]commons-fileUpload组件解决文件上传(文件名)乱码问题
- 使用commons-fileupload实现文件(doc、pdf)上传,提取表单参数并解决中文乱码
- 解决Apache的文件上传组件FileUpLoad的中文乱码问题
- struts2解决文件上传下载中文乱码问题
- 解决linux环境tomcat下载文件404的问题(路径中文乱码)
- 解决COS、FileUpload上传文件时中文文件名乱码问题
- Java Web中使用JSPSmartUpload控件实现文件的上传和下载(解决了中文乱码问题)(JSP页面采用GBK编码)
- 真正解决jspSmartUpload组件上传下载文件时中文乱码问题!!!
- 解决,文件上传到 ftp 服务器,中文出现乱码问题
- 文件下载(已解决重复下载反应慢、中文乱码等问题)
- 关于spring mvc web工程上传下载中文文件出现乱码的问题
- 解决使用Spring Boot、Multipartfile上传文件路径错误问题