文件上传入门一

来源:互联网 发布:网络代购 编辑:程序博客网 时间:2024/06/05 18:17
1.客户端上传文件:在web页面中添加上传输入项":<input type="file" name="filename">
(1)file输入项必须有name属性才能提交
(2)上传用的表单必须是POST提交,因为GET提交提交的参数将以URL后请求参数的方式提交,大小有限只能是1k
(3)上传用的表单设置enctype为multipart/form-data
只要把enctype为multipart/form-data,提交时请求的正文将会被分割为多个部分,每个部分都对应一个上传项,其中代表文件上传的项中会有文件的内容
2.服务器端接受处理文件
使用Apache提供的Commons-fileupload实现文件上传
需要导入两个包:commons-fileupload-1.2.1.jar 和commons-io-1.4.jar

(1)DiskFileItemFactory --- 
文件上传工厂类,用来生产文件上传核心类


public DiskFileItemFactory(int sizeThreshold, java.io.File repository) 

public DiskFileItemFactory() 
public void setSizeThreshold(int sizeThreshold) 
public void setSizeThreshold(int sizeThreshold) 


如果不设置则内存缓冲区的大小为10K,临时文件夹的位置和具体的操作系统有关,可以用System.getProperty("java.io.tmpdir")获取当前系统的默认临时文件夹的位置


(2)ServletFileUpload -- 
文件上传的核心类,可以用来解析request对象,将每个字段项或文件上传项封装为FileItem对象组成集合后返回


boolean isMultipartContent(HttpServletRequest request) 判断上传表单是否为multipart/form-data类型

List parseRequest(HttpServletRequest request)
解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。
setFileSizeMax(long fileSizeMax)
设置单个上传文件的最大值
setSizeMax(long sizeMax) 
设置上传文件总量的最大值
setHeaderEncoding(java.lang.String encoding)
设置编码格式,解决上传文件名乱码问题
setProgressListener(ProgressListener pListener)
实时监听文件上传状态


(3)FileItem--
判断自己是一个文件上传项还是一个普通字段项
boolean  isFormField() 判断FileItem是一个文件上传对象还是普通表单对象
如果是一个普通字段项,可以获取字段项的名和值
String  getFieldName()  获得普通表单对象的name属性
String  getString(String encoding) 获得普通表单对象的value属性,可以用encoding进行编码设置,解决表单中中文的问题;


如果是一个文件上传项,可以获取文件名和指向文件正文的流
String  getName() 获得上传文件的文件名(有些浏览器会携带客户端路径)
InputStream getInputStream()  获得上传文件的输入流

delete()  在关闭FileItem输入流后,删除临时文件


入门代码:UploadServlet.java

package com.oterman.web;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;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;import com.oterman.utils.IOUtils;public class UploadServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");//1.构建工厂DiskFileItemFactory factory=new DiskFileItemFactory();//2.由工厂生产文件上传的类;ServletFileUpload  upload=new ServletFileUpload(factory);//解决文件名乱码;upload.setHeaderEncoding("utf-8");//3.解析request对象;List<FileItem> itemList=null;try {itemList = upload.parseRequest(request);} catch (FileUploadException e) {e.printStackTrace();}for(FileItem item:itemList){if(item.isFormField()){//输入的是非文件项String name=item.getFieldName();String value=item.getString("utf-8");//解决表单中的中文乱码问题;System.out.println("name:"+name+"  value:"+value);}else{//输入的是文件项;String filename=item.getName();//解决ie文件名问题;ie上传文件时,文件名带着路径;filename=filename.substring(filename.lastIndexOf("\\")+1);InputStream in=item.getInputStream();OutputStream out=new FileOutputStream(this.getServletContext().getRealPath("/upload/"+filename));IOUtils.in2out(in, out);IOUtils.close(in, out);}}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

工具类IOUtils.java:

package com.oterman.utils;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.Reader;import java.io.Writer;public class IOUtils {private IOUtils(){}//字节流输出public static void in2out(InputStream in,OutputStream out) throws IOException{byte[] buf=new byte[1024];int len=0;while((len=in.read(buf))!=-1){out.write(buf,0,len);}}//字符流输出;public static void in2out(Reader in,Writer out) throws IOException{char[] buf=new char[1024];int len=0;while((len=in.read(buf))!=-1){out.write(buf,0,len);}}//关闭流public static void close(InputStream in,OutputStream out) throws IOException{in.close();out.close();}}



0 0
原创粉丝点击