刚学完Web的文件上传下载功能,之前学.net的时候就接触过Web文件的上传下载功能,但无奈.net的功能封装的使用太过简单,都完全搞不懂技术要点,一个fileuploade服务端控件,什么都搞定。学java的长传下载功能听起来很简单,但练习的时候还是犯了一些低级错误。
简单总结下文件上传/下载实现流程。
文件上传:我们通过阿帕奇的一个开源组件对文件进行上传。即fileuplode组件。
1)首先需要一个表单,一个控件<input type="file">值得注意的是form后面必须有enctype="multipart/form-data"这样一段内容。
2)准备一个出来表单的servlet,这时候可以将apache的两个jar包导入到工程,分别是主包commons-fileupload-1.2.1.jar和支撑jar包commons-io-1.4.jar。
3)需要了解上传的几个核心api代码如下:
//得到工厂
FileItemFactory fif=new DiskFileItemFactory();
//通过工厂获得ServletFileUpload 实例
ServletFileUpload file=new ServletFileUpload(fif);
//判断是否为文件提交表单
if(ServletFileUpload.isMultipartContent(request)){
try {
//通过ServletFileUpload 获得上传的FileItem集合,每一个上传参数对应一个FileItem
List<FileItem> list=file.parseRequest(request);
//遍历集合
for(FileItem item:list){
//普通表单的处理方式,值得注意的是表单使用enctype="multipart/form-data字样后,参数不能通过request.getParameter()方式获取
if(item.isFormField()){
System.out.println(item.getFieldName());
System.out.println(item.getString("utf-8"));
}
//处理上传的文件
else{
//获得上传文件名
String filename=item.getName();
//出来上传的文件文件名,加上系统时间前缀,避免上传文件名重复。
filename=System.currentTimeMillis()+"^"+filename;
//将文件写入到指定 的位置。
String path=getServletContext().getRealPath("/uplode");
item.write(new File(path,filename));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
文件下载:文件下载需要注意几点。
1)通常使用指定的路径来获取文件夹下的所有文件的名字:
String path=getServletContext().getRealPath("/uplode");
File files=new File(path);
String[] names=files.list();
2)将文件的名字通过map集合带到jsp中展示,key为文件的全名(即上传后加上的前缀)value为文件被上传时使用的名字(即通过字符串截取去掉前缀后的名字)这样文件在jsp中列表的时候使用value,点击下载时则将key带到服务器进行处理
3)下载请求的处理代码如下:
try {
String key=request.getParameter("key");
if(key==null||key.trim().length()<=0){
return;
}
response.setHeader("content-disposition", "attachment; filename=" + key.substring(key.lastIndexOf("^")+1));
InputStream in=getServletContext().getResourceAsStream("/uplode/"+key);
OutputStream out = response.getOutputStream();
byte[] b=new byte[1024];
int len=0;
//这里容易出错,如果写成while((len=in.read())!=-1)你就悲剧了运行不会报错,但是下载的文件就会出问题,调试的时候一直以为是路径的问题,浪费了很多时间,估计很久找不到,我就犯了这样的低级错误。
while((len=in.read(b))!=-1){
out.write(b, 0, len);
}
out.close();
in.close();
} catch (Exception e) {
throw new RuntimeException(e);
}