文件上传入门一

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值