Taskmanagement中需要用到附件的上传和下载,在网上找到了相应的资料,才完成这样的功能。
下面是两篇有关文件上传的资料,
http://xiaoduan.blog.51cto.com/502137/137909/
http://jiaguwen123.iteye.com/blog/705740
文件上传,我使用的是Apache Common FileUpload,使用到的jar包在上面的第一篇文章中有,如果不好下载,我等一下也上传一份,这样下载会比较方便.已经上传了(http://download.youkuaiyun.com/detail/sunnybuer/4936240)。直接上代码来的比较的经济实惠。
处理请求端,我是使用servlet的,
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = upload.parseRequest(request);
Iterator iterator = items.iterator();
while (iterator.hasNext()) {
FileItem item = (FileItem) iterator.next();
if (!item.isFormField()) { //ignore the form element
String fileName = item.getName();
// TODO filesize int is it ok?
int size = (int) item.getSize();
String root = "";//Set the root
File path = new File(root + "/uploads");
if (!path.exists()) {
boolean status = path.mkdirs();
}
item.write(uploadedFile); //write file to disk
}
}
}
首先我们会判断这个请求是不是一个文件上传的请求,如果是的话,我们才会进行下面的操作。这个是第一行和第二行代码的意思。
文件上传的发送请求端,我是使用jsp写的,
<form action="taskcontroller" method="post" enctype="multipart/form-data">
<label for="filename_1">File: </label>
<input id="filename_1" type="file" name="filename_1" size="50"/><br/>
<input type="submit" value="upload" name="command" />
</form>
在处理上传的过程中,我碰到了这样的一个问题:对于上传的这种请求,我不能从里面提取出我想要的除了文件之外的信息。例如,我想上传一个文件,另外我想附带这个文件的一些评论信息,这些评论信息是由用户填写的,但是对于文件上传这样的请求方式,我却不能从request获得用户填写的评论信息,或者是我们找到相应的api来获得这样的信息,如果有知道的,请告诉我,谢谢!我现在使用的方法是,单单上传文件后,再后服务器传回刚才上传文件的标识码,然后再进行写评论等其他的操作。
同理,这里也直接上代码,
response.reset();
File file = new File(tempPath, fileName);
if (file.exists()) {
response.setContentType(contentType);
response.addHeader("Content-Disposition", "attachment; filename=\""
+ file.getName() + "\"");//注释1
int fileLength = (int) file.length();
response.setContentLength(fileLength);
if (fileLength != 0) {
InputStream in = new FileInputStream(file);
byte[] buffer = new byte[4096];
ServletOutputStream servletOS = response.getOutputStream();
int readLength = -1;
while ((readLength = in.read(buffer)) != -1) {
servletOS.write(buffer, 0, readLength);
}
in.close();
servletOS.flush();
servletOS.close();
}
}
上面的代码就能支持文件的下载,很方便。这里顺便提一下,在上面代码中注释1的地方,这里我们的file.getName()我们可以替换成这个文件上传是的名字,这样用户体验会好一点。你们觉得呢?