zoukankan      html  css  js  c++  java
  • 文件的上传与下载---------------------待补充

    一:文件上传

    1.表单需要的准备一知识点

      请求方式为post,不方便使用get

      使用file表单域,type=“file”

      使用的编码方式是二进制,enctype=“multipart/form-data”

        表单的默认值是application/x-www-form-urlencoded,试用与少量的字符集。

    2.服务端准备

      不能使用request.getParamete获取信息,因为编码方式已经改了。

      可以使用输入流的方式,但是不建议

      具体使用commons-fileupload完成上传操作

    3.加入两个jar包

      commons-fileupload-1.3.3.jar

      commons-io-2.5.jar

    4.基本思想

      commons-fileupload:

        可以解析请求,得到FileItem对象组成的List

        把所有的请求信息都解析为FileItem对象,无论是文本域还是文件域

        可以调用FileItem的isFormField方法判断是一个表单域或不是一个表单域

        再进一步获取信息

          

    二:helloUpload程序

    1.upload.jsp

     1 <%@ page language="java" contentType="text/html; charset=utf-8"
     2     pageEncoding="utf-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     7 <title>Insert title here</title>
     8 </head>
     9 <body>
    10     <form action="uploadServlet" method="post" enctype="multipart/form-data">
    11         File:<input type="file" name="file"/>
    12         <br><br>
    13         Desc:<input type="text" name="desc"/>
    14         <br>
    15         <input type="submit" value="Submit">
    16     </form>
    17 </body>
    18 </html>

    2.UploadServlet.java

     1 package com.web;
     2 
     3 import java.io.File;
     4 import java.io.FileOutputStream;
     5 import java.io.IOException;
     6 import java.io.InputStream;
     7 import java.io.OutputStream;
     8 import java.util.List;
     9 
    10 import javax.servlet.ServletException;
    11 import javax.servlet.annotation.WebServlet;
    12 import javax.servlet.http.HttpServlet;
    13 import javax.servlet.http.HttpServletRequest;
    14 import javax.servlet.http.HttpServletResponse;
    15 
    16 import org.apache.commons.fileupload.FileItem;
    17 import org.apache.commons.fileupload.FileUploadException;
    18 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    19 import org.apache.commons.fileupload.servlet.ServletFileUpload;
    20 
    21 
    22 @WebServlet("/uploadServlet")
    23 public class UploadServlet extends HttpServlet {
    24     
    25     private static final long serialVersionUID = 1L;
    26 
    27     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    28         DiskFileItemFactory factory=new DiskFileItemFactory();
    29         factory.setSizeThreshold(1024*1024*7);
    30         File tempDirectory=new File("d:\tempDirectory");
    31         factory.setRepository(tempDirectory);
    32         
    33         ServletFileUpload upload=new ServletFileUpload(factory);
    34         upload.setSizeMax(1024*1024*5);
    35         try {
    36             List<FileItem> items=upload.parseRequest(request);
    37             for(FileItem item : items) {
    38                 if(item.isFormField()) {
    39                     String name=item.getFieldName();
    40                     String value=item.getString();
    41                     System.out.println(name+"==="+value);
    42                 }else {
    43                     String fieldName=item.getFieldName();
    44                     String fileName=item.getName();
    45                     
    46                     //获取不带路径的文件名
    47                     int start = fileName.lastIndexOf("\");  
    48                     String fileName2 = fileName.substring(start+1);
    49                     
    50                     String contentType=item.getContentType();
    51                     boolean isInMemory=item.isInMemory();
    52                     long sizeInBytes=item.getSize();
    53                     System.out.println(fieldName);
    54                     System.out.println(fileName);
    55                     System.out.println(fileName2);
    56                     System.out.println(contentType);
    57                     System.out.println(isInMemory);
    58                     System.out.println(sizeInBytes);
    59                     
    60                     InputStream in=item.getInputStream();
    61                     byte[] buffer=new byte[1024];
    62                     int len=0;
    63                     fileName2="d:\files\"+fileName2;
    64                     System.out.println(fileName2);
    65                     OutputStream out=new FileOutputStream(fileName2);
    66                     while((len=in.read(buffer))!=-1) {
    67                         out.write(buffer, 0, len);
    68                     }
    69                     out.close();
    70                     in.close();
    71                 }
    72             }
    73         } catch (FileUploadException e) {
    74             e.printStackTrace();
    75         }
    76     }
    77 
    78 }

    3.结果

      

    三:应用

    1.需求

      上传

        在页面上使用jquery实现新增一个附件,删除附件,但是需要保留一个

        对文件的扩展名与文件的大小进行验证,若是出现错误,在页面上显示错误信息,如果通过验证,文件上传后文件名不能重复,在对应的数据表中增加一条记录

      下载

    2.添加jquery的包

      jquery-1.7.2.js

    3.项目目录

    4.upload.jsp

     1 <%@ page language="java" contentType="text/html; charset=utf-8"
     2     pageEncoding="utf-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     7 <title>Insert title here</title>
     8 <script type="text/javascript" src="jquery-1.7.2.js"></script>
     9 <script type="text/javascript">
    10 $(function(){
    11     
    12     var i = 2;
    13     
    14     $("#addFile").click(function(){
    15         //添加
    16         $(this).parent().parent().before("<tr class='file'><td>File"
    17                 +i+":</td><td><input type='file' name='file"
    18                 +i+"'</td></tr>"
    19                 +"<tr class='desc'><td>Desc"
    20                 +i+":</td><td><input type='text' name='desc"
    21                 +i+"'/><button id='delete"
    22                 +i+"'>删除</button></td></tr>");
    23         i++;
    24         //删除
    25         $("#delete"+(i-1)).click(function(){
    26             var $tr=$(this).parent().parent()
    27             $tr.prev("tr").remove()
    28             $tr.remove()
    29             //对i进行排序
    30             $(".file").each(function(index){
    31                 $(this).find("td:first").text("File"+(index+1))
    32                 $(this).find("td:last input").attr("name","file"+(index+1))
    33             });
    34             $(".desc").each(function(index){
    35                 $(this).find("td:first").text("Desc"+(index+1))
    36                 $(this).find("td:last input").attr("name","desc"+(index+1))
    37             })
    38         })
    39         
    40         return false;
    41     })
    42 });
    43 </script>
    44 </head>
    45 <body>
    46     <font color="red">${message }</font>
    47     <br><br>    
    48     <form action="fileuploadservlet" method="post" enctype="multipart/form-data">
    49         
    50         <table>
    51             <tr class="file">
    52                 <td>File1:</td>
    53                 <td><input type="file" name="file1"/></td>
    54             </tr>
    55             <tr class="desc">
    56                 <td>Desc1:</td>
    57                 <td><input type="text" name="desc1"/></td>
    58             </tr>
    59             
    60             <tr>
    61                 <td><input type="submit" id="submit" value="提交"/></td>
    62                 <td><button id="addFile">新增一个附件</button></td>
    63             </tr>
    64         </table>
    65         
    66     </form>
    67 </body>
    68 </html>

    5.效果图

      

    6.配置文件upload.properties

    1 exts=pptx,docx,doc
    2 file.max.size=1048576
    3 total.file.max.size=5242880

    7.对properties操作的工具类FileUploadAppProperties.java

     1 package com.web.app.utils;
     2 
     3 import java.util.HashMap;
     4 import java.util.Map;
     5 
     6 public class FileUploadAppProperties {
     7     private FileUploadAppProperties() {}
     8     
     9     private static Map<String,String> properties=new HashMap<>();
    10     
    11     private static FileUploadAppProperties instance=new FileUploadAppProperties();
    12     
    13     public  static FileUploadAppProperties getInstance() {
    14         return instance;
    15     }
    16     
    17     public static void addProperty(String propertyName,String propertyValue) {
    18         properties.put(propertyName, propertyValue);
    19     }
    20     
    21     public static String getProperty(String propertyName) {
    22         return properties.get(propertyName);
    23     }
    24 }

    8.使用监听器进行初始化FileUploadAppListener.java

     1 package com.web.app.listener;
     2 
     3 import java.io.InputStream;
     4 import java.util.Map;
     5 import java.util.Properties;
     6 
     7 import javax.servlet.ServletContextEvent;
     8 import javax.servlet.ServletContextListener;
     9 import javax.servlet.annotation.WebListener;
    10 
    11 import com.web.app.utils.FileUploadAppProperties;
    12 
    13 @WebListener
    14 public class FileUploadAppListener implements ServletContextListener {
    15 
    16     public FileUploadAppListener() {
    17         
    18     }
    19 
    20     public void contextInitialized(ServletContextEvent arg0)  { 
    21         InputStream in=getClass().getClassLoader().getResourceAsStream("/upload.properties");
    22         Properties properties=new Properties();
    23         try {
    24             properties.load(in);
    25             for(Map.Entry<Object, Object> pro:properties.entrySet()) {
    26                 String propertyName=(String) pro.getKey();
    27                 String propertyValue=(String) pro.getValue();
    28                 FileUploadAppProperties.getInstance().addProperty(propertyName, propertyValue);
    29             }
    30         } catch (Exception e) {
    31             e.printStackTrace();
    32         }
    33         
    34     }
    35     
    36     public void contextDestroyed(ServletContextEvent arg0)  { 
    37          
    38     }
    39 
    40 }

    9.

        

      

  • 相关阅读:
    认识Cookie和状态管理
    python之requests库使用问题汇总
    如何掌握所有的程序语言--王垠
    非 GUI 模式运行 JMeter 压力测试
    Python 如何将字符串转为字典
    python之operator操作符函数
    python3使用xlrd、xlwt、xlutils、openpyxl、xlsxwriter操作excel
    《敏捷软件测试:测试人员与敏捷团队的实践指南》
    Jmeter跨线程组传递变量
    Jmeter获取当前时间、历史时间、未来时间的方式
  • 原文地址:https://www.cnblogs.com/juncaoit/p/7629286.html
Copyright © 2011-2022 走看看