zoukankan      html  css  js  c++  java
  • 文件上传

    1.文件上传页面显示

    upload.jsp

      <body>
        <form action="uploadServlet" method="post" enctype="multipart/form-data">
          File:<input type="file" name="file"/>
          <input type="submit" value="Submit"/>
        </form>
      </body>
    

    进行文件上传时,表单需要做的准备:

    ①请求方式为post:<form action="uploadServlet" method="post">

    ②使用file的表单域:<input type="file" name="file"/>

    ③使用multipart/form-data的请求编码方式:<form action="uploadServlet" method="post" enctype="multipart/form-data">

    关于enctype属性取值:

    • application/x-www-form-urlencoded:表单enctype属性的默认值。这种编码方式使用有限的字符集,当使用了非字母和数字时,必须使用“%HH”代替(H代表十六进制数字)。对于大容量的二进制数据或包含非ASCII字符的文本来说,这种编码不能满足需求。
    • multipart/form-data:form设定了enctype="multipart/form-data"属性后,表示表单以二进制传输数据。

    服务端不能再使用request.getParameter()等方式获取请求信息,获取不到,因为请求的编码方式已经改为multipart/form-data,以二进制的方式提交请求信息。可以使用输入流的方式来获取,但是不建议这样做,操作起来太麻烦,具体使用commons-fileupload组件来完成文件的上传操作。

    2.文件上传操作

    2.1 环境搭建

    加入commons-fileupload.jar包,commons-io.jar包

    commons-io,jar包版本过高容易出现找不到有关类的错误。

    2.2 基本思想

    • commons-fileupload可以解析请求,得到一个FileItem对象组成的List;
    • commons-fileupload把所有的请求信息都解析为FileItem对象,无论是一个一般的文本域还是文件域;
    • 可以调用FileItem的isFormField()方法来判断是一个表单域或不是表单域(文件域);
    • 再来进一步获取信息,如果是一个文本,获取名字和值,如果是一个文件的话,获取文件名,contentType,文件大小等。

    2.3 如何得到List<FileItem>对象

    //create a factory for disk-based file items
    DiskFileItemFactory factory = new DiskFileItemFactory();
    //create s new file upload handler
    ServletFileUpload upload = new ServletFileUpload(factory);
    //parse the request
    List fileItems = upload.parseRequest(req);
    

    也可以为文件的上传加入一些限制和其他的属性。

     DiskFileItemFactory factory = new DiskFileItemFactory();
     // 设置内存中最多可以存放的上传文件的大小,若超出则把文件写到一个临时的文件夹中,以byte为单位
     factory.setSizeThreshold(4096);
     // 设置临时文件夹的位置
     factory.setRepository(new File("/tmp"));
     ServletFileUpload upload = new ServletFileUpload(factory);
     // 设置上传文件的总的大小,也可以设置单个文件的大小
     upload.setSizeMax(1000000);
     List fileItems = upload.parseRequest(req);
    

     2.4 实例代码

    index.jsp

      <body>
        <a href="jspPage/upload.jsp">上传文件</a>
        <br><br>
        <a href="jspPage/download.jsp">下载文件</a>
      </body>
    

    upload.jsp

      <body>
        <form action="uploadServlet" method="post" enctype="multipart/form-data">
          File:<input type="file" name="file"/>
          <input type="submit" value="Submit"/>
        </form>
      </body>
    

    uploadServlet.java

    package com.javaweb.file;
    
    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 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;
    
    public class uploadServlet extends HttpServlet {
    	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		 //1.得到FileItem的集合items
    		 DiskFileItemFactory factory = new DiskFileItemFactory();
    		 // 设置内存中最多可以存放的上传文件的大小,若超出则把文件写到一个临时的文件夹中,以byte为单位
    		 factory.setSizeThreshold(1024*500);
    		 // 设置临时文件夹的位置
    		 File temDirectory=new File("e:\");
    		 factory.setRepository(temDirectory);
    		 ServletFileUpload upload = new ServletFileUpload(factory);
    		 // 设置上传文件的总的大小,也可以设置单个文件的大小
    		 upload.setSizeMax(1024*1024*5);
    		 try {
    		 //2.遍历items:若是一个一般的表单域,打印信息,若是文件域,则把文件保存到指定的磁盘位置
    			List<FileItem> fileItems = upload.parseRequest(request);
    			for(FileItem fileItem:fileItems){
    				if(fileItem.isFormField()){
    					String name=fileItem.getFieldName();
    					String value=fileItem.getString();
    					System.out.println(name+":"+value);
    				}else{
    					String fieldName=fileItem.getFieldName();
    					String fileName=fileItem.getName();
    					String contentType=fileItem.getContentType();
    					long sizeInBytes=fileItem.getSize();
    					System.out.println(fieldName);
    					System.out.println(fileName);
    					System.out.println(contentType);
    					System.out.println(sizeInBytes);
    				    InputStream in=fileItem.getInputStream();
    				    byte[] buffer=new byte[1024];
    				    int len=0;
    				    //fileName="e:\"+fileName;
    				    OutputStream out=new FileOutputStream(fileName);
    				    while((len=in.read(buffer))!=-1){
    				    	out.write(buffer,0,len);
    				    }
    				    out.close();
    				    in.close();
    				}
    			}
    		} catch (FileUploadException e) {
    			e.printStackTrace();
    		}
    		
    	}
    
    }
    

    在web.xml中进行配置:

    <servlet>
     <servlet-name>uploadServlet</servlet-name>
     <servlet-class>com.javaweb.file.uploadServlet</servlet-class>
    </servlet>
    <servlet-mapping>
     <servlet-name>uploadServlet</servlet-name>
     <url-pattern>/uploadServlet</url-pattern>
    </servlet-mapping>
    

    运行后,

  • 相关阅读:
    window10+python3.7安装tensorflow--gpu tensorflow 安装
    解决plsql中文显示问号(???)问题
    卷积神经网络通俗解读
    NLP进阶之(七)膨胀卷积神经网络
    如何用简单易懂的例子解释条件随机场(CRF)模型?它和HMM有什么区别?
    【Learning Notes】线性链条件随机场(CRF)原理及实现
    【机器学习】【条件随机场CRF-2】CRF的预测算法之维特比算法(viterbi alg) 详解 + 示例讲解 + Python实现
    条件随机场(CRF)
    条件随机场(CRF)
    条件随机场(CRF)
  • 原文地址:https://www.cnblogs.com/naihuangbao/p/9998231.html
Copyright © 2011-2022 走看看