zoukankan      html  css  js  c++  java
  • upload三种上传方式(上)---Servlet---post---commons-fileupload.1.2.1.jar方式请求上传文件

    上传前进行的配置选项:

    1、在下方的Servers中,右键你的tomcat--open,选中下面两个配置。

     

    第一个:Serve modules without publishing

    作用:tomcat默认时,会将你的项目拷贝至tomcat中的Server path目录下进行部署运行,当选中该配置后,则会使用你的项目位置部署运行。

    (补充:在上方Server Locations配置中,我选中的是第二个,所以会在K:apache-tomcat-8.0.37-windows-x64apache-tomcat-8.0.37wtpwebappsmystudy..进行部署运行,如果是选中默认第一个,则会拷贝该项目在tomcat中的.metadada目录中复制一个并进行部署运行)

    例如:未勾选时,我的tomcat的默认部署路径为K:apache-tomcat-8.0.37-windows-x64apache-tomcat-8.0.37wtpwebappsmystudy..,勾选后,我的tomcat的部署路径为K:shxtsxxmgcmystudy..

    (补充:tomcat自带重新部署的功能,即reloadable=true,如果reloadable=false,只是在项目修改后不会自动重新部署,但是resatrt或者关闭eclipse,再重新打开,它还是会重新部署,因此,当上传的文件放在tomcat的目录路径下时,无论怎样都会消失,所以最好的方式是将上传的文件存放到项目目录下)

    -----------------------------------------------------------------------------------------------------------------

    第二个:Publish module contexts to separate XML files

    作用:将你的Server下面的server.xml中的<context>属性分离出来,在你的tomcat->conf->Catalina->localhost中生成一个与你项目对应的xml文件(补充:其名称与你项目的发布根路径名称相同,即<context path="">中path属性的值)

    在低版本的tomcat(补充:我从7.0开始用的,所以很少见到)中,如果不勾选该配置,则会出现红色的警告[警告: [SetPropertiesRule] Setting property 'source' to 'org.eclipse.jst.jee.server:TestTomcat6.0.16' did not find a matching property. ],同时,对于项目的管理也更加的方便。

    -----------------------------------------------------------------------------------------------------------------

    2、上传所使用的包

    Commons-fileupload-xx.jar

    Commons-io-xx.jar

    网盘链接:http://pan.baidu.com/s/1i5EK9Sh

    密码:br2e

    (补充:我用的是1.2.1版本)

    一、传统Servlet---post请求上传方式,使用的是DiskFileItemFactory和ServletFileUpload

    Servlet代码:(全部是org.apache.commons.fileupload.**下面的)

     1 package com.yong.upload;
     2 
     3 import java.io.File;
     4 import java.io.FileOutputStream;
     5 import java.io.IOException;
     6 import java.io.InputStream;
     7 import java.util.List;
     8 import java.util.UUID;
     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  * Servlet implementation class FileUpload
    23  */
    24 @WebServlet("/FileUpload")
    25 public class FileUpload extends HttpServlet {
    26     private static final long serialVersionUID = 1L;
    27     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    28         //硬盘文件项工厂--把IO流转换成临时文件
    29         DiskFileItemFactory factory = new DiskFileItemFactory();
    30         //servlet文件上传
    31         ServletFileUpload upload = new ServletFileUpload(factory);
    32         try {
    33             List<FileItem> list = upload.parseRequest(request);
    34             if(list.size()>0){
    35                 
    36                 //获取流字符串
    37                 String message = list.get(0).getString("UTF-8");
    38                 response.setContentType("text/html;charset=utf-8");
    39                 
    40 response.getWriter().print(message); 41 42 //由于每次上传只能上传一个文件,因此直接在list中get(0)就能获得上传的该文件。 43 FileItem item = list.get(1); 44 //获取文件后缀名 45 String fileExtraName = item.getName().substring(item.getName().lastIndexOf(".")); 46 //生成新的文件名 47 String newFileName = UUID.randomUUID().toString()+fileExtraName; 48 49 //上传路径 50 String path = request.getRealPath("file"); 51 System.out.println(path); 52 53 //生成文件 54 File file = new File(path,newFileName); 55 56 InputStream ins = item.getInputStream(); 57 FileOutputStream fos = new FileOutputStream(file); 58 byte[] b = new byte[1024]; 59 while(true){ 60 int n = ins.read(b); 61 if(n == -1){ 62 break; 63 } 64 //写入服务器 65 fos.write(b,0,n); 66 } 67 ins.close(); 68 fos.close(); 69 } 70 } catch (FileUploadException e) { 71 e.printStackTrace(); 72 System.out.println("上传失败!"); 73 } 74 } 75 }

    jsp页面代码:

    1 <form action="FileUpload" method="post" enctype="multipart/form-data">
    2     <input type="text" name="message">
    3     <input type="file" name="file" id="file" value="aaa">
    4     <button type="submit">注册</button>
    5 </form>

    操作流程总结:

    第一步:配置环境

    (1)勾选两个配置信息

    (2)引入 commons-fileupload-1.2.1.jarcommons-io-1.2.1.jar 两个jar包

    第二步:编写jsp文件

    (1)注意在input中加入“enctype='multipart/form-data'”属性

    (2)method='post' 使用post请求

    第三步:编写servlet.java

    (1)创建servlet.java命名为FileUploadServlet.java

    创建 DiskFileItemFactory factory = new DiskFileItemFactory();

    创建 ServletFileUpload upload = new ServletFileUpload(factory);

    使用upload解析reqeust请求传过来的数据 upload.parseRequest(request);类型为list

    如果你的<input type='file'>是第一个,则使用list.get(0)来获取,结果为FileItem类型

    最后以流的形式读数据后再写入磁盘中,大功告成。

  • 相关阅读:
    【建兰普及模拟赛第一场】20181023
    【Uva11400 Lighting System Design】动态规划
    【洛谷 P2388 阶乘之乘】模拟
    【Uva1025 A Spy in the Metro】动态规划
    【洛谷P2028 龙兄摘苹果】动态规划
    【洛谷P1507 NASA的食物计划】动态规划
    【洛谷P1795 无穷的序列_NOI导刊2010提高(05)】模拟
    【洛谷P1281 书的复制】二分+动态规划
    【洛谷P4933 大师】动态规划
    「GXOI / GZOI2019」旧词
  • 原文地址:https://www.cnblogs.com/zhiyonglu/p/7822585.html
Copyright © 2011-2022 走看看