1.如何使用开源组件以及查看文档
- 开源组件:
commons-fileupload-1.4-bin.zip
commons-io-2.6-bin.zip
2. 以fileupload组件为例学习如何使用开源包
解压 commons-fileupload-1.4-bin.zip得到两个文件夹apidoc和site
其中site为用户指导,apidoc为相关类以及类方法的说明文档
2.基本思想
>commons-fileupload 可以解析请求,得到一个由FileItem对象组成的List
>commons-fileupload把所有的请求信息都解析为FileItem对象,无论是一个一般的文本域还是文件域
>可以调用FileItem的isFormField()方法来判断是一个表单域或不是一个表单域(文本域)
>其他
// Process a regular form field
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString();
...
}
// Process a file upload
if (!item.isFormField()) {
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
InputStream uploadedStream = item.getInputStream();
...
uploadedStream.close();
}
3. 基本使用方法
简单的方式
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Configure a repository (to ensure a secure temp location is used)
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List<FileItem> items = upload.parseRequest(request);
复杂的方式:可以为文件的上传添加一些控制或者其他的功能
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Set factory constraints
//设置读入内存的文件的大小,若内存的文件超出改大小,就把这部分文件写入磁盘(临时文件夹),单位byte
factory.setSizeThreshold(yourMaxMemorySize);
//设置临时文件夹
factory.setRepository(yourTempDirectory);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置一次reques所能上传的总文件的大小
upload.setSizeMax(yourMaxRequestSize);
// Parse the request
List<FileItem> items = upload.parseRequest(request);
4. 简单使用的HelloWord
/**
* Servlet implementation class UploadServlet
*/
@WebServlet("/uploadServlet")
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.得到FileItem的集合items
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置读入内存的文件的大小500k,若内存的文件超出改大小,就把这部分文件写入磁盘(临时文件夹),单位byte
factory.setSizeThreshold(1025*500);
//设置临时文件夹
File tempDirectory = new File("E:\\tmp");
factory.setRepository(tempDirectory);
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置一次reques所能上传的总文件的大小<5M
upload.setSizeMax(1024*1024*5);
// Parse the request
try {
List<FileItem> items = upload.parseRequest(request);
//2.遍历items,若item为一般的表单域,则打印信息,若不为表单域(文件域),就写入磁盘
for(FileItem item : items) {
if(item.isFormField()) {//如果是表单域
String name = item.getFieldName();
String value = item.getString();
System.out.println(name+" : "+value);
}else {//如果不是表单域(文件域)
String fileName = item.getName();
String fileNameArray[] = fileName.replaceAll("\\\\","/").split("/");
//进行文件传输
String path = "E:\\tmp\\" +fileNameArray[fileNameArray.length-1] ;
InputStream in = item.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
FileOutputStream out = new FileOutputStream(path);
while( (len = in.read(buffer)) != -1) {
out.write(buffer,0,len);
}
out.close();
in.close();
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}