实现web开发中的文件上传功能,需完成如下二步操作:

    1、在web页面中添加上传输入项。
   2、在servlet中读取上传文件的数据,并保存到本地硬盘中。
      在web页面中添加上传输入项:
              <input type=“file”>标签用于在web页面中添加文件上传输入项(就会有一个浏览按钮),设置文件上传输入项时须注意:
            1、 必须要设置input输入项的name属性,否则浏览器将不会发送上传文件的数据。
            2、必须把form的enctype属值设为multipart/form-data.设置该值后,浏览器在上传文件时,将把文件数据附带在http请求消息
                    体中,并使用MIME协议对上传的文件进行描述,以方便接收方对上传数据进行解析和处理。
            FORM的enctype属值multipart/form-data与application/x-www-form-urlencoded的区别 :

FORM元素的enctype属性指定了表单数据向服务器提交时所采用的编码类型,默认的缺省值是“application/x-www-form-

urlencoded”。 然而,在向服务器发送大量的文本、包含非ASCII字符的文本或二进制数据时这种编码方式效率很低。文

件上载时,所使用的编码类型应当是“multipart/form-data”,它既可以发送文本数据,也支持二进制数据上载。Browser

端<form>表单的ENCTYPE属性值为multipart/form-data,它告诉我们传输的数据要用到多媒体传输协议,由于多媒体传

输的都是大量的数据,所以规定上传文件必须是post方法,<input>的type属性必须是file。

        在Servlet中读取文件上传数据,并保存到本地硬盘中:            
             使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:Commons-fileupload和commons-io。
             commons-io 不属于文件上传组件的开发jar文件,但Commons-fileupload 组件从1.1 版本开始,它工作时需要commons-io包
             的支持。
        为什么不用getInputStream方法的原因:
             Request对象提供了一个getInputStream方法,通过这个方法可以读取到客户端提交过来的数据。但由于用户可能会同时上传
             多个文件,在servlet端编程直接读取上传数据,并分别解析出相应的文件数据是一项非常麻烦的工作。为方便用户处理文件
             上传数据,Apache 开源组织提供了一个用来处理表单文件上传的一个开源组件( Commons-fileupload ),该组件性能优
             异,并且其API使用极其简单,可以让开发人员轻松实现web文件上传功能,因此在web开发中实现文件上传功能,通常使用
             Commons-fileupload组件实现。
核心API—ServletFileUpload
       DiskFileItemFactory 是创建 FileItem 对象的工厂,这个工厂类常用方法:
             public void setSizeThreshold(int sizeThreshold)
             设置内存缓冲区的大小,默认值为10K。当上传文件大于缓冲区大小时, fileupload组件将使用临时文件缓存上传文件。
             public void setRepository(java.io.File repository)
             指定临时文件目录,默认值为System.getProperty("java.io.tmpdir").
             public DiskFileItemFactory(int sizeThreshold, java.io.File repository)
             构造函数       
       ServletFileUpload 负责处理上传的文件数据,并将表单中每个输入项封装成一个 FileItem 对象中。常用方法有:
             boolean isMultipartContent(HttpServletRequest request)
             判断上传表单是否为multipart/form-data类型
             List parseRequest(HttpServletRequest request)
             解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。
             setFileSizeMax(long fileSizeMax)
             设置上传文件的最大值
             setSizeMax(long sizeMax)
             设置上传文件总量的最大值
             setHeaderEncoding(java.lang.String encoding)
             设置编码格式
             setProgressListener(ProgressListener pListener)
             获取进度监视器ProgressListener 对象

上传文件中应当注意的细节:

         1上传中文文件的乱码问题:
             文件名中文乱码问题,可调用ServletUpLoader的setHeaderEncoding方法,或者设置request的setCharacterEncoding属性
             l临时文件的删除问题
             由于文件大小超出DiskFileItemFactory.setSizeThreshold方法设置的内存缓冲区的大小时,Commons-fileupload组件将使用临
             时文件保存上传数据,因此在程序结束时,务必调用FileItem.delete方法删除临时文件。
             Delete方法的调用必须位于流关闭之后,否则会出现文件占用,而导致删除失败的情况。
       2上传的普通输入项的乱码问题:

手工转码,用户名的乱码问题:

                paramValue= new String(paramValue.getBytes("iso8859-1"),"utf-8");

                利用FileItem类的getString(String encoding)

String getString(String encoding)  throws   UnsupportedEncodingException

       3、 文件存放位置问题:
             为保证服务器安全,上传文件应保存在应用程序的WEB-INF目录下,或者不受WEB服务器管理的目录。

             为防止多用户上传相同文件名的文件,而导致文件覆盖的情况发生,文件上传程序应保证上传文件具有唯一文件名。
             为防止单个目录下文件过多,影响文件读写速度,处理上传文件的程序应根据可能的文件上传总量,选择合适的目录
             结构生成算法,将上传文件分散存储。

如表示url资源时应该用斜杠 “/”

如表示硬盘路径时用斜杠“\\”

       4、 临时文件的删除问题
             代码必须放在流关闭语句的最后面,因为正在使用的文件是不能删除的
             DiskFileItemFactory  factory = new DiskFileItemFactory();

factory.setRepository(new File(this.getServletContext().getRealPath("/temp")));

……

FileItem item;

……

item.delete();

5、 限制文件上传的最大值问题:

调用解析器的:upload.setFileSizeMax(1024*1024);  //上传文件不能超过1M。如果超出大小,需要给用户友好提示:

try{

  ……

}catch (FileUploadBase.FileSizeLimitExceededException e) {

request.setAttribute("message", "上传文件不能超过1M!!");

}

     6、 ProgressListener 显示上传进度问题

ProgressListener progressListener = new ProgressListener() {

public void update(long pBytesRead, long pContentLength, int pItems) {

System.out.println("到现在为止,  " + pBytesRead + " 字节已上传,总大小为 "  + pContentLength);

}

};

upload.setProgressListener(progressListener);

 
实现代码:
       upload.jsp  

<form action="${pageContext.request.contextPath}/servlet/UploadServlet2" enctype="multipart/form-data" method="post">

用户名:<input type="text" name="username" /><br/>

文件1<input type="file" name="file1" /><br/>

文件2<input type="file" name="file2" /><br/>

<input type="submit" value="上传" /><br/>

                </form>

UploadServlet.java

            package cn.class3g.web.servlet;

import java.io.File;
            import java.io.FileOutputStream;
            import java.io.IOException;
            import java.io.InputStream;
            import java.io.PrintWriter;
            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.FileUploadBase.FileSizeLimitExceededException;
            import org.apache.commons.fileupload.FileUploadException;
            import org.apache.commons.fileupload.disk.DiskFileItemFactory;
            import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadServlet2 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {
                             doPost(request,response);
                     }
                   public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  
                           // request.setCharacterEncoding("UTF-8");

try {
                              // 1、建立工厂对象
                                  DiskFileItemFactory factory = new DiskFileItemFactory();
                              //factory.setRepository(new File("F:\\"));
   
                              // 2、得到上传文件解析器
                                  ServletFileUpload upload = new ServletFileUpload(factory);
                                  upload.setHeaderEncoding("utf-8");//处理上传文件
 
                              // 3、设定上传文件尺寸
                                   upload.setFileSizeMax(1024*1024);
           
                              // 4、进行解析,得到fileItem对象
                                 List<FileItem> list = upload.parseRequest(request);

// 5、对list进行迭代处理
                                 for (FileItem item : list) {
                                     if (item.isFormField()) {// 表单普通输入项

String paramName = item.getFieldName();
                                        //String paramValue = item.getString();

//paramValue = new String(paramValue.getBytes("ISO8859-1"),"UTF-8");
                                         String paramValue=item.getString("utf-8");
                                         System.out.println("普通输入项" + paramName + "==" + paramValue);

} else {// 上传文件处理
                                       //获取上传文件名
                                         String fileName = item.getName();
                                       // 如果文件xxx中有目录,则去掉目录部分只保留文件名
                                         fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
                                               System.out.println("name =" + fileName);
     
                                       if (!fileName.equals(" ")) {
      
                                               fileName =refactorFileName(fileName) ;
                                               System.out.println("filename = " + fileName);

InputStream in = item.getInputStream();
                                               File file = new File("F:\\" + fileName);
                                               FileOutputStream fos = new FileOutputStream(file);

byte[] buffer = new byte[1024];
                                               int len = 0;
                                        while ((len - in.read(buffer)) > 0) {
                                                    fos.write(buffer, 0, len);
                                         }

fos.flush();
                                        fos.close();
                                        in.close();
                                        item.delete();
  
                                               request.setAttribute("message", "文件上传成功");

}
                                      }
                                   }

}catch(FileSizeLimitExceededException e1){
                                                e1.printStackTrace();
                                    request.setAttribute("message", "上传文件尺寸太大!!!");
                                 }catch (FileUploadException e) {
                                               e.printStackTrace();
                                    request.setAttribute("message", "文件上传失败!!!");
                                 }
                                     request.getRequestDispatcher("/message.jsp").forward(request, response);  
                                 }
 
              public String refactorFileName(String fileName){
                      return UUID.randomUUID().toString() + "_" + fileName;  
              }

}

文件上传与下载----上传相关推荐

  1. windows主机用scp命令向Linux服务器上传和下载文件

    windows主机用scp命令向Linux服务器上传和下载文件 文章目录: 一.scp介绍 二.scp上传和下载 1.上传 2.下载 三.scp的更多参数 一.scp介绍 scp是secure cop ...

  2. JavaWeb -- Struts1 多文件上传与下载 DownloadAction, DispatchAction

    1. 多文件上传与下载 上传下载jsp: <%@ page language="java" import="java.util.*" pageEncodi ...

  3. nginx java文件上传_Nginx实现文件的上传和下载

    文件的上传只要保证特殊的地址先到达Nginx,然后通过Nginx指定至指定的服务器即可,目前配置是本机.文件的下载的做法就是把本机的当前目录下面的文件给返回回去. server { listen ; ...

  4. 将本地文件上传或下载到Linux云服务器的三种方法

    1.WinSCP 这款软件可以在windows操作系统中进行安装使用.具有图形化界面,比较友好,操作简单.功能全面,适合刚入门的菜鸟乃至老鸟进行使用. WinSCP 可以执行所有基本的文件操作,例如下 ...

  5. .Net简单上传与下载

    .Net简单上传与下载 上传: 首先上传我们需要一个控件-FileUpLoad: 再加上一个上传按钮: 在上传按钮的Click事件中添加如下代码: 1 FileUpload1.SaveAs(Serve ...

  6. java上传加密_Java上传下载文件并实现加密解密

    使用 Jersey 服务器实现上传,使用 HTTP 请求实现下载 引入依赖 在 pom.xml 中添加 Jersey 相关依赖 com.sun.jersey jersey-client 1.18.1 ...

  7. Angular 文件上传与下载

    Angular文件上传与下载 文件上传 方式1 使用NG ZORRO中的组件. 文件下载 方式1 直接下载 方式2 通过HTTP请求后端数据的方式进行下载 文件上传 方式1 使用NG ZORRO中的组 ...

  8. [转]文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等)实现汇总1

    转自:http://blog.csdn.net/soarheaven/archive/2008/12/08/3474152.aspx 最近项目需要对FTP服务器进行操作,现把实现总结如下: 打算分2篇 ...

  9. Linux 中 3 个文件打包上传和下载相关命令详解

    tar 命令 通过 SSH 访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候tar 命令就是必不可少的一个功能强大的工具.Linux 中最流行的tar是麻雀虽小,五脏俱全,功能强大. 使用t ...

最新文章

  1. [16] 螺旋面(Spire)图形的生成算法
  2. UIDatePicker | 时间选择器
  3. Springboot注册Filter
  4. aix 的c库为什么都是静态库_卢卡库:若梅罗、莱万都在努力突破极限,为什么我不能做到呢...
  5. zookeeper集群安装部署
  6. java集合性能测试,关于Map和List的性能测试
  7. PHP100个知识点之2 日期时间(一)
  8. MySQL 导入 csv、excel 或者 sql 文件
  9. android音频杂音问题_三星手机与iOS13 双蓝牙音频输出功能体验报告 「Soomal」
  10. C# 匿名函数 详解
  11. 优化理论03----优化导论和无约束问题的最优条件、优化问题的类型、局部、全局和严格优化、梯度和Hessian 黑塞矩阵和方向导数、无约束问题的最优条件
  12. STM8 GPIO输入输出模式
  13. 11月14日Fluent建模笔记
  14. 大二Web课程设计——张家界旅游网站设计与实现(HTML+CSS+JavaScript)
  15. 关于十六进制发送和显示(VS上位机和下位机)
  16. 高德地图放图钉_Google地图中的图钉掉了-如何定位和删除图钉
  17. 深圳高新区发展专项计划管理办法(征求意见稿)
  18. css来回摆动,css3 animation(左右摆动) (放大缩小)
  19. android 设置路由器,安卓手机怎么设置路由器?
  20. 计算机 学院派,总校计算机学院派老师来校召开“2+2”联合培养班学生见面会...

热门文章

  1. jq的三种选择qi_您已经选择了带有qi无线充电功能的无线耳机
  2. 【硬核扫盲】到底什么是相干光通信?
  3. android之使用QQ互联实现qq账号登录App
  4. 怎么申请专利?专利多久下证?专利申请费用多少?
  5. oa移动办公怎么修改服务器端口,移动办公oa怎么知道服务器地址
  6. 考研英语一复习经验帖【干货】
  7. window10总提示幸福倒计时,解决方法
  8. [洛谷P3758][TJOI2017]可乐
  9. PFM格式图像和读取middlebury 数据集
  10. 痞子衡嵌入式:PCM编码与Waveform音频文件(.wav)格式详解