• JavaWeb文件的上传与下载(1)


    经常用到的上传:

      头像上传,资料分享等

    文件上传的步骤

    1、指定表单类型为文件上传表单

      enctype="multipart/form-data"

    2、表单提交方式必须为:post(get方式只能提交1k大小的数据)

    3、表单中存在文件域表单元素

    如下:

     <form action="${pageContext.request.contextPath/test }" method="post" enctype="multipart/form-data" >
        	文件:<input type="file" name="file1" /><br>
        	用户名:<input type="text" name="username" /><br>
        	<input type="submit" value="提交" />
        </form>
    

      


    一、手动实现文件上传

    代码如下

    package com.gqx.uploadself;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
     * 手动处理文件上传
     * @author Administrator
     *
     */
    public class test extends HttpServlet {
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		/*
    		 * 下面的方法是通常我们用的request.getParameter()方法的原型
    		 * 下面的方法经过解析后就是request.getParameter()方法了
    		 */
    		//request.getQueryString();	//获取GET:username=gqxing&pwd=111
    		//request.getInputStream();//获取POST:inputStream
    		
    		/*
    		 * 现在获取的是文件数据,是post请求,只能用request.getInputStream()
    		 */
    		//获取表单(POST)数据
    		InputStream in=request.getInputStream();
    		//转为为字符流
    		InputStreamReader inReader=new InputStreamReader(in);
    		//为了读取方便,加入一个缓冲流BufferedReader(读取字符流)
    		BufferedReader reader=new BufferedReader(inReader);
    		String str=null;
    		while((str=reader.readLine())!=null){
    			System.out.println(str);
    		}
    	}
    
    	 public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		 this.doGet(request, response);
    	}
    
    }
    

    之后启动服务器,提交表单和上传文件(这里是文本文件)后就会看到控制台的的输出一下内容

     

     如果需要获取上传数据,需要对上面的结果进行解析(就是对字符串的处理),每一次上传都是这样的结构,每一次都要解析,将每一个上传项通过FileItem去封装相应的数据,但这样自己写一个解析程序,有点麻烦,同时不利于代码的后期维护,别人对你代码不太熟悉,这个时候可以使用apach提供的一个组件。


    二、使用FileUpload组件(apach提供)

    api说明

    —DiskFileItemFactory 文件上传的工厂类(把每一个请求表单封装为一个个的FileItem对象)

       setRepository(repository);设置删除临时目录(当上传文件过大的时候,会把文件写入临时文件,再从临时文件输出到指定文件中,再把临时文件清除)

    —ServletFileUpload  文件上传核心类,可以获取所有的FileItem对象

      isMultipartContent(request):判断文件是否是表单类型

      parseRequest(request):获取所有文件上传项

      setFileSizeMax(fileSizeMax); 设置上传总文件的最大值

      setSizeMax(sizeMax);设置单个文件上传的最大值

      setHeaderEncoding("utf-8");设置上传文件的编码格式

    —FileItem 封装了普通表单项的值以及上传表单项的值

      item.getFieldName();   获取上传表单元素名称

      item.getString();     获取上传数据

      item.getString("utf-8")  获取上传数据,处理中文

      item.getContentType(); 获取上传文件类型【一般用于文件项】

      item.getInputStream(); 获取文件流【一般用于文件项】

      item.getName();     获取文件名【一般用于文件项】

      item.write(file);     写文件【一般用于文件项】

      item.delete()      删除临时文件【一般用于文件项】

    组件使用:

      下载组件;引入jar文件(commons-fileupload-1.2.1.jar 和 commons-io-1.4.jar )

       实例代码如下

      

    package com.gqx.uploadjar;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    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.FileItemFactory;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    /**
     * 文件上传组件的使用
     * @author Administrator
     *
     */
    public class FileUpLoad extends HttpServlet {
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		//1、创建文件上传工厂类
    		FileItemFactory fac=new DiskFileItemFactory();
    		//2、创建文件上传的核心类对象
    		ServletFileUpload upload=new ServletFileUpload(fac);
    		//判断当前表单是否是文件上传表单
    		if (upload.isMultipartContent(request)) {
    			
    			//3、把请求数据转化为FileItem对象集合
    			List<FileItem> list;
    			try {
    				list = upload.parseRequest(request);
    				//遍历每一个上传项
    				for (FileItem fileItem : list) {
    					//判断:是普通表单项,还是文件上传表单
    					if (fileItem.isFormField()) {
    						//普通表单
    						String fileName=fileItem.getFieldName();	//表单元素名称
    						String content=fileItem.getString();	//文本框值
    						System.out.println(fileName+content);
    					}else {
    						//文件上传表单
    						String fileName=fileItem.getFieldName();	//表单元素名称
    						String contentType=fileItem.getContentType();	//文件类型
    						String name=fileItem.getName();	//文件名
    						InputStream in=fileItem.getInputStream();		//文件流
    						System.out.println(fileName+contentType+name+in);
    					}
    					
    				}
    			} catch (FileUploadException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			
    			
    		}
    	}
    
    	 public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		 this.doGet(request, response);
    	}
    
    }
    

     运行结果如下:


     案例:

      实现一个完整的文件上传

      1、设置单个文件不超过30兆

      2、设置总大小不超过50兆

      3、上传目录:上传到项目资源目录下的upload目录下

    代码如下:

    package com.gqx.uploadjar;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    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.FileItemFactory;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    /**
     * 文件上传的完整案例
     * @author Administrator
     *
     */
    public class FileUpLoadCase extends HttpServlet {
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		// 1、创建上传工厂类
    		DiskFileItemFactory factory=new DiskFileItemFactory();
    		//2、创建文件上传核心类
    		ServletFileUpload upload=new ServletFileUpload(factory);
    		//[1]设置当个文件最大:30M
    		upload.setFileSizeMax(30*1024*1024);
    		//[2]设置总文件大小不超过50M
    		upload.setSizeMax(50*1024*1024);
    		//判断是否是文件上传表单
    		if (upload.isMultipartContent(request)) {
    			//3、把请求数据转化为FileItem的集合
    			try {
    				List<FileItem> items=upload.parseRequest(request);
    				//遍历FileItem
    				for (FileItem fileItem : items) {
    					//判断普通表单还是文本表单
    					if (fileItem.isFormField()) {
    						//获取元素名称
    						String fieldName=fileItem.getFieldName();
    						//获取值
    						String value=fileItem.getString("utf-8");
    						System.out.println(fieldName+":"+value);
    						
    					}else {
    						//文件上传
    						//获取文件名
    						String name=fileItem.getName();
    						//获取文件目录
    						String basePath=getServletContext().getRealPath("/upload");
    						//创建文件对象
    						File file=new File(basePath,name);
    						fileItem.write(file);
    						fileItem.delete();//删除临时文件
    					}
    				}
    			
    			} catch (Exception e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		
    		
    		
    	}
    
    	 public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		 this.doGet(request, response);
    	}
    
    }
    

      

  • 相关阅读:
    CTF-域渗透--SSH服务
    CTF-域渗透--SMB信息泄露
    CTF-域渗透--FTP服务后门利用
    Codeforces Round #628 (Div. 2)
    模板
    模板
    Educational Codeforces Round 6
    Educational Codeforces Round 5
    模板
    Codeforces Round #627 (Div. 3)
  • 原文地址:https://www.cnblogs.com/helloworldcode/p/6129658.html
Copyright © 2020-2023  润新知