日期:2014-05-20  浏览次数:20847 次

commons-fileupload求解释
这是我今天找的代码,可以用,但有些地方我不清楚,请大家给我说话O(∩_∩)O~



package servlets;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class AddDataServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();//向文本输出流打印对象的格式化表示形式。
  //设置保存上传文件的目录
String uploadDir = getServletContext().getRealPath("/") + "upload"; // 获得服务器的绝对路径
if(uploadDir == null) {
out.print("无法访问存储目录!");
return;
}
System.out.println("存储目录:"+uploadDir);
File fUploadDir = new File(uploadDir);
if(!fUploadDir.exists()) {
if(!fUploadDir.mkdir()) {
out.println("无法创建存储目录!");
return;
}
}

// 设置存储临时文件的目录【我见了这个目录下面有些临时文件,不过不知道这是何时产生的?有什么作用?】
String tempPath = "d:\\upload\\";
if(tempPath == null) {
out.print("无法访问临时存储目录!");
return;
}
File fTempPath = new File(tempPath);
if(!fTempPath.exists()) {
if(!fTempPath.mkdir()) {
return;
}
System.out.println("创建临时存储目录");
}

// Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);//这里是查询是否有上传请求???
if(!isMultipart)
{
out.println("只能处理multipart/form-data类型的数据!");
return;
}

DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置最多只允许在内存中存储的数据
factory.setSizeThreshold(1024*4);
// 设置临时文件存储目录
factory.setRepository(new File(tempPath));
// 创建一个上传文件的ServletFileUpload对象
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置最大的上传限制
upload.setSizeMax(1024*1024*50);
try{
// 处理HTTP请求,items是所有的表单项
List items = upload.parseRequest(request);//这里不是很清楚???????parseRequest这个不是产生什么流吗?【Processes an RFC 1867 compliant multipart/form-data stream.】
// 遍历所有的表单项
for(Iterator it = items.iterator(); it.hasNext();) {
FileItem item = (FileItem)it.next();
if(item.isFormField()) {//如果是一个简单的表单域。。。?????
String name = item.getFieldName();
String value = item.getString("utf-8");
}
else {//否则就是文件域?????
// 取得文件域的表单域名
String fieldName = item.getFieldName();
// 取得文件名
String fileName = item.getName();
// 取得文件类型
String contentType = item.getContentType();
System.out.println(contentType+"文件类型");
// 生成上传文件的文件名
FileOutputStream fos = new FileOutputStream(request.getRealPath("/") + fileName.substring(fileName.lastIndexOf("\\"),fileName.length()));
// 如果上传文件域对应文件内容已经在内存中
if(item.isInMemory()) {
fos.write(item.get());//写入输出流指向的文件路径
}
// 如果文件内容不完全在内存中【这里是什么意思?是文件太大吗?】
else {
// 获取上传文件内容的输入流
InputStream is = item.getInputStream();
byte[] buffer = new byte[1024];
int len;
// 读取上传文件的内容,并将其写入服务器的文件中
while((len = is.read(buffer)) > 0) {
fos.write(buffer,0,len);
}
is.close();