您的位置:首页 > 其它

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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐