首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

commons-fileupload求解释解决方案

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

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();


fos.close();
}
}
}
}catch(FileUploadException e) {
e.printStackTrace();
}
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}

}


[解决办法]
boolean isMultipart = ServletFileUpload.isMultipartContent(request);//这里是查询是否有上传请求???
// 设置存储临时文件的目录【我见了这个目录下面有些临时文件,不过不知道这是何时产生的?有什么作用?】
——用来让Upload组件来临时存放浏览器所上传文件的。


这里是检查表单POST数据的方式,一般来说上传文件的话,要multipart/form-data类型,如:
<form enctype="multipart/form-data" action="http://192.168.29.65/UploadFile" method="post">


List items = upload.parseRequest(request);//这里不是很清楚???????parseRequest这个不是产生什么流吗?
——这个是让upload组件对request的信息进行解析,研究有多少内容。



if(item.isFormField()) {//如果是一个简单的表单域。。。?????
else {//否则就是文件域?????
——是,就是判断是否为表单字段。


// 如果文件内容不完全在内存中【这里是什么意思?是文件太大吗?】
——是,大文件会被Upload组件写进临时目录中去。


热点排行