文件上传基础知识点

一、文件上传设计到的技术

*什么是文件上传:把本地文件放到服务器中,这个过程为文件的上传。

*实现文件上传:在servlet里面没有提供上传的技术,需要使用第三方的技术

    - 第一种技术:jspsmartupload 适于嵌入执行上传下载操作的JSP文件中,应用模型一:jsp+javabean
            
    - 第二种技术: fileupload 应用于模型二,mvc模式。
         
         --FileUpload 是 Apache commons下面的一个子项目,组件FileUpload依赖于Commons IO组件

二、文件上传三点要求

*实现文件上传要求

    -第一个要求:有表单,在表单里面提交方式必须是post

    -第二个要求:需要有一个文件的输入项,同时在文件输入项里面必须有name属性
	<input type="file" name="file"/>

    -第三个要求:form属性
	enctype="application/x-www-form-urlencoded"修改为enctype="multipart/form-data"

三、文件上传实现步骤

*文件上传实现步骤(固定的步骤 fileupload)
	
    -第一步:创建一个磁盘文件项工厂 new DiskFileItemFactory()

    -第二步:创建核心上传类 new ServletFileUpload(FileItemFactory fileItemFactory)

    -第三步:使用核心上传类里面方法解析request对象 ,得到文件上传项
        List<FileItem> parseRequest(javax.servlet.http.httpServletRequest request);
			
    -第四步:返回list集合,集合里面的每一个部分都是FileItem
	判断是文件输入项还是普通输入项
			
    -第五步:如果是普通输入项,输出内容
	如果是文件上传项,执行上传操作(上传代码)

四、核心API,涉及到常用的方法


*涉及的方法,API的使用:
=================
* DiskFileItemFactory:磁盘文件项工厂
	- 构造方法:
		* 有两个,一个是没有参数的,一个是有参数的
		
                DiskFileItemFactory(int sizeThreshold, java.io.File repository)
		- 两个参数:
                        第一个参数是临时空间的大小
			第二个参数临时文件存储路径,上传文件超过了临时空间的大小产生临时文件
		
                DiskFileItemFactory(),当使用没有参数的构造方法,提供了两个方法,可以设置临时空间,存储路径
		- setSizeThreshold(int sizeThreshold):设置临时空间的大小,超过该大小,会产生临时文件
		- setRepository(java.io.File repository): 临时文件存储路径

================
* ServletFileUpload类
	- 构造方法:
		-- ServletFileUpload(FileItemFactory fileItemFactory)

	- 方法:
		- List  parseRequest(javax.servlet.http.HttpServletRequest request)
			* 解析request对象,返回list集合,集合里面的每部分都是一个FileItem

		- setFileSizeMax(long fileSizeMax) :设置单个文件上传的大小
		- setSizeMax(long sizeMax):设置所有的文件上传的总的大小
		- setHeaderEncoding(java.lang.String encoding):设置上传文件名里面包含中文,设置编码

===============
* FileItem
	- isFormField() :是否是一个普通输入项,返回值boolean,是true是一个普通输入项
	- getString():得到普通输入项的值
	- getString(java.lang.String encoding):处理普通输入项中文乱码
	- getFieldName():得到普通输入项的名称
	- getName() :得到文件上传的名称
		** 有某些浏览器下面,得到不是文件名称,而是带路径的名称
		** 需要截取字符串完成操作
		//得到上传文件的名称
		String filename = fileItem.getName(); //C:\Users\asus\Desktop\1.txt
		//得到文件的名称 并不是所有的浏览器都是这样,有些浏览器就是得到文件名称
		int lens = filename.lastIndexOf("\\");
		if(lens != -1) {
			filename = filename.substring(lens+1);
		}
	- getInputStream():得到文件的输入流
	- delete() :删除产生的临时文件

五、代码演示

package com.ayit.upload;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.UUID;

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.ayit.utils.UploadUtils;

public class Upload extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		try {
			// 创建磁盘文件项目工厂
			DiskFileItemFactory factory = new DiskFileItemFactory();
			// 设置临时存储大小和临时文件存储位置
			factory.setSizeThreshold(1024 * 1024 * 10);
			factory.setRepository(new File(getServletContext().getRealPath("temp")));

			// 创建核心上传类
			ServletFileUpload upload = new ServletFileUpload(factory);
			// 处理文件乱码问题
			upload.setHeaderEncoding("utf-8");
			//单个文件大小和上传多个文件总大小处理
			upload.setFileSizeMax(1024*1024*100);
			upload.setSizeMax(1024*1024*1024);
			// 解析request
			List<FileItem> fileItem = upload.parseRequest(request);
			
			// 遍历集合
			for (FileItem fileItem2 : fileItem) {
				if (fileItem2.isFormField()) {
					//普通输入项获取内容,并处理中文问题
					String fieldName = fileItem2.getFieldName();
					String username = fileItem2.getString("utf-8");
					System.out.println(fieldName+":"+username);
				}else{
					//文件输入项
					//获取文件输入项路径
					String filename = fileItem2.getName();
					int index = filename.lastIndexOf("\\");
					if(index!=-1){
						filename = filename.substring(index+1);
					}
					
					//获取文件存储路径,目录分离
					String realPath = getServletContext().getRealPath("resource");
					String  path = UploadUtils.getPath(realPath);
					String savePath = realPath+path;
					File file = new File(savePath);
					if(!file.exists()){
						file.mkdirs();
					}
					
					//处理文件重名问题
					String uuid = UUID.randomUUID().toString();
					filename = uuid+"_"+filename;
					
					//文件输入流
					InputStream in = fileItem2.getInputStream();
					//文件输出流
					OutputStream out = new FileOutputStream(savePath+"/"+filename);
					//流对接
					int len = 0;
					byte[] b = new byte[1024];
					while((len=in.read(b))!=-1){
						out.write(b,0,len);
					}
					in.close();
					out.close();
				}
			}

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

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

}
<body>
    	<form action="${pageContext.request.contextPath }/upload" method="post" enctype="multipart/form-data">
    		<input type="text" name="username"/><br/>
    		
    		<input type="button" value="添加文件项" onclick="add();">
    		<div id="div"></div>
    		<input type="submit" value="上传"/>
    	</form>
  </body>
  <script type="text/javascript">
  	function add(){
  		var div = document.getElementById("div");
  		div.innerHTML += "<div><input type='file' name='filename'/><input type='button' value='删除' onclick='del(this)'/><br/></div>";
  	}
  	function del(who){
  		var div = who.parentNode;
  		var div1 = document.getElementById("div");
  		div1.removeChild(div);
  	}
  </script>

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值