文档章节

文件的上传

_-Leon-_
 _-Leon-_
发布于 2014/06/18 22:20
字数 1705
阅读 207
收藏 8
点赞 0
评论 0

#文件上传 文件的上传其实是比较简单的,只要实现两步就可以了:

  • 在web页面中添加上传输入项
  • 在servlet中读取上传文件的数据,并保存到本地磁盘中

###添加上传输入项也需要两步

  • 使用 <input type="file">标签,一定要设置name属性,不然不会被提交
  • 将所在form的 enctype 属性设置为 multipart/form-data,设置该值后,浏览器就会把上传的文件数据附带在http请求的消息体中,并使用MIME协议对上传文件进行描述

###在Servlet中获取数据

如果提交的表单使用了 multipart/form-data,那么就Servlet中就不能直接用requets对象来获取数据了,因为如果使用了 multipart/form-data 设置表单,浏览器就会使用MIME协议来描述表单的所有项。那么如果要获取数据,就需要使用request对象来获取输入流,然后对流进行MIME解析。对MIME解析不是一件容易的事情,因为上传的文件类型会非常多,而个数不定。所以一般在实际开发中,一般使用第三方上传组件来完成文件上传功能。

第三方上传组件比较多,比较常用的有:Commons-fileupload、Cos组件等

###Commons-fileupload Commons-fileupload是Apache基金会的一个开源组件,该组件性能优异,并且API使用也比较简单。如果要使用该组件,需要给应用添加两个Jar包:

  • Commons-fileupload
  • Commons-io(Commons-fileupload组件从1.1版本开始,依赖该Jar)

###Commons-fileupload组件工作图: Commons-fileupload组件工作图

根据上图的步骤,可以看出,步骤非常简单:使用DiskFileItemFactory获取一个ServletFileupload对象,然后获取FileItem即可。获取到FileItem之后,也有对应的API来获取FileItem的一些信息:

  • 普通字段:isFormField() getFieldName() getString()
  • 上传文件:getInputStream() getName()

demo示例多个文件上传的处理。(对于ie6的绝对路径的截取来获取文件名)

#上传需要处理的细节 上传其实并不难,主要是需要细心,去处理很多细节,来把程序写得易用。

###乱码问题

  • 上传文件的乱码问题,直接使用ServletFileupload对象的setHeaderEncoding()方法来解决
  • 普通输入项的乱码解决,只能使用手动来转换,使用request设置编码已经没有用了,inputValue = new String(inputValue.getBytes("ISO8859-1"), "UTF-8"),也可以直接使用FileItem的getString方法,这个方法被重载了,也设置编码,其实内部实现代码就是手动转码的代码。

###判断表单类型

  • 在开发中,应该首先判断提交的表单是否 multipart/form-data 类型的表单。使用 ServletFileupload 对象的isMultipartContent()方法来进行判断
  • 如果是普通表单,就应该使用普通方法来进行处理,如果是上传表单,就使用组件处理

###设置缓冲区 在上传中,很有可能有比较大型的文件,那么对于大型文件的上传处理,比较好的处理就是使用缓冲区来进行处理。fileupload组件支持内存缓冲区和临时文件缓冲区。 当文件不是很大的时候,直接使用内存缓冲区来处理,但是如果文件太大,内存缓冲区就不过用了,就要使用临时文件来处理,这个具体的临界值要根据实际的服务器环境来恒定,使用了临时文件后,对应的输入流就是从临时文件来读取数据了。

  • 使用 DiskFileItemFactory 对象来设置缓冲区:
      * `setSizeThreshold(int sizeThreshold)`,设置内存缓冲区的大小,默认值为10K。当上传文件大于缓冲区大小时,将使用临时文件缓存上传文件
      * `setRepository(java.io.File repository)`,指定临时文件目录,默认值为 System.getProperty("java.io.tmpdir")
      * 可以在工厂创建的时候指定这些值
    

有一点要特别注意,如果使用了临时文件存储,临时文件是不会自动删除的,在上传结束后,需要手动删除fileitem.delete()

###上传的安全隐患 一般的,不要将上传文件的保存目录设置在项目根目录中,这是一件很危险的事情。因为别人可以将一个写好的jsp上传上去,然后通过客户端让其运行,如果该jsp中有恶意代码,将会攻陷服务器(shutdown -s -t 200shutdown -a)。 应该将上传文件的目录保存到WEB-INF文件夹中,这个文件夹是禁止非本应用资源访问的。

###上传文件的类型 这个其实很简单,首先定义一个可上传类型的集合或者枚举,然后对上传文件的名字进行验证就可以了。

###上传文件的大小 上传是由解析器来处理的,所以设置上传文件大小的设置在ServletFileupload中,它的常用方法有:

  • bololean isMultipartContent(HttpServletRequest request),判断上传表单是否为 multipart/form-date 类型
  • List parseRequest(HttpServletRequest request),解析request对象,封装成FileItem集合
  • setFileSizeMax(long fileSizeMax) ,设置文件上传最大值
  • setSizeMax(long sizeMax),设置上传文件总量的最大值
  • setHeaderEncoding(java.lang.String encoding),设置编码格式

###多文件上传的空文件 在实际开发中,一般都是对一个文件的处理,多文件并不多,多文件的上传本身就相对要考虑的问题多一些。如果是多文件,而用户没有全部选择文件,这时也是很容易导致后台程序出错的,所以在后台也要做这方面的处理。(非空验证,如果是空,就不要处理等)

###上传文件的名称 在做上传的时候,很可能出现重复的文件名称,那么就需要给每个上传的文件一个唯一的名称。常见的命名策略有:使用UUID+文件名称、使用毫秒数+随机数+文件名称等等。 在这个过程中有一个问题,那就是把所有的文件是否存在一个文件夹中呢?答案肯定是不能。对于操作系统来说,一个文件夹的文件过多,那么在查找的时候必然会影响性能,所以对于上传的文件,不光要考虑文件名称的唯一性,还需要考虑怎样提升查找的性能。

一般的做法是按照年月日去创建文件夹目录结构,这样就可以很容易的解决掉这个问题。 还有一些使用算法来实现的,这种情况一般应用在特别多的上传量的情况下(base64计算文件夹,hash值计算文件夹)。

© 著作权归作者所有

共有 人打赏支持
_-Leon-_
粉丝 10
博文 17
码字总数 34045
作品 0
朝阳
部门经理
PHP 多文件上传的三种方法

这里介绍三种多文件上传的方法,前两种都是直接遍历三维超全局数组,最后一种是先定义一个单文件上传函数,再循环调用该函数,完成多文件的上传。 成功返回包括文件名的路径。

渺小的尘埃 ⋅ 2013/12/04 ⋅ 1

一些文件上传组件(Flash,JQuery,asp,php,js,AJAX)

FancyUpload FancyUpload是一个采用Flash与Ajax(MooTools)技术实现包含上传进度条的多文件上传组件,类似于SWFUpload。 FancyUpload Mootools jqUploader 结合Javascript与Flash开发,拥有...

老朱教授 ⋅ 2017/10/01 ⋅ 0

angularJS上传文件

导入 //导入 var uplo

紫枫5966 ⋅ 2017/05/11 ⋅ 0

SpringMVC 单文件上传与多文件上传

一、简述 一个javaWeb项目中,文件上传功能几乎是必不可少的,本人在项目开发中也时常会遇到,以前也没怎么去理它,今天有空学习了一下这方面的知识,于是便将本人学到的SpringMVC中单文件与...

CSDN_LQR ⋅ 2017/06/22 ⋅ 0

7 款 JavaScript 的 Ajax 文件上传插件

jQuery File Upload jQuery File Upload 是一个Jquery图片上传组件,支持多文件上传、取消、删除,上传前缩略图预览、列表显示图片大小,支持上传进度条显示;支持各种动态语言开发的服务器端...

oschina ⋅ 2012/05/09 ⋅ 13

文件上传漏洞原理与实例测试

0x00 什么是文件上传 为了让用户将文件上传到网站,就像是给危机服务器的恶意用户打开了另一扇门。即便如此,在今天的现代互联网的Web应用程序,它是一种常见的要求,因为它有助于提高业务效...

nw01f ⋅ 2016/07/22 ⋅ 0

PHP文件上传代码

创建一个文件上传表单 允许用户从表单上传文件是非常有用的。 请看下面这个供上传文件的 HTML 表单: <html><body> <form action="upload_file.php" method="post"enctype="multipart/form-d......

梦梦阁 ⋅ 2016/01/07 ⋅ 0

安全测试之文件上传攻击

文件上传攻击 文件上传类应用的范围还是很广泛的,利用这个应用同样也可以进行攻击。文件上传的方式有多种,可以通过FTP也可以通过HTTP等,对比起来,FTP的上传需要管理大量的用户帐号,并且...

zouhui1003it ⋅ 01/05 ⋅ 0

【php增删改查实例】第二十三节 - PHP文件上传

22. PHP文件上传 22.1 资源文件 将这三个东西拷贝项目的根目录。 拷贝完毕后,打开upload.html: 现在,我们在项目的根目录去编写一个upload.php。 22.4 文件上传 在PHP中,文件上传的时候会默...

剽悍一小兔 ⋅ 06/07 ⋅ 0

基于express的bodyParser() 解析请求体实现文件上传功能

基于express的bodyParser() 解析请求体实现文件上传功能 一个完整的博客怎么能缺少图片呢?现在,我们来给博客添加文件上传功能,这样我们就可以使用 markdown 来链接图片了。 上传文件目前有...

maweitao ⋅ 2014/04/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

懒惰根本就不存在

简评:芝加哥大学心理学教授,懒惰根本就不存在。(本文表面讲行为心理学实则讲教育) 金句:以好奇而不是判断来回应一个人的无效行为,是非常有帮助的。 本文「我」代表原作者 E Price。 自...

极光推送 ⋅ 23分钟前 ⋅ 0

Excel提取单元格中最后一个“.”后面的数据

java.lang.String ----- String =TRIM((MID(SUBSTITUTE(B2,".",REPT(" ",99)),(LEN(B2)-LEN(SUBSTITUTE(B2,".","")))*99,99)))...

klog ⋅ 25分钟前 ⋅ 0

mac远程桌面

下载安装remote-desktop-mac Mac beta 客户端 mac通过远程桌面访问windows服务器。

亚林瓜子 ⋅ 29分钟前 ⋅ 0

firrtl

动手---sbt(2)之后,再回头看 chisel第一个实验,根据 https://github.com/freechipsproject/firrtl 发现firrtl没有执行sbt assembly命令,重新执行这个命令,结果成功。如下图: joe@joe-As...

whoisliang ⋅ 33分钟前 ⋅ 0

NIO

一、通道(Channel):用于源节点与目标节点的连接。在 Java NIO 中负责缓冲区中数据的传输。Channel 本身不存储数据,因此需要配合缓冲区进行传输。 二、通道的主要实现类 java.nio.channel...

stars永恒 ⋅ 34分钟前 ⋅ 0

Android悬浮窗的实现

0. 前言   现在很多应用都使用到悬浮窗,例如微信在视频的时候,点击Home键,视频小窗口仍然会在屏幕上显示。这个功能在很多情况下都非常有用。那么今天我们就来实现一下Android悬浮窗,以...

猴亮屏 ⋅ 34分钟前 ⋅ 0

日志采集中的关键技术分析

概述 日志从最初面向人类演变到现在的面向机器发生了巨大的变化。最初的日志主要的消费者是软件工程师,他们通过读取日志来排查问题,如今,大量机器日夜处理日志数据以生成可读性的报告以此...

tqyin ⋅ 35分钟前 ⋅ 0

使用Navicat将数据导出为text文本 然后再导入

将数据导出为text文本效率很高 1. 准备工作 1.1 准备表结构 1.2 目标库 执行生成表结构sql 2.将表数据导出为text文本 生成的text文本 3. 目标库 导入text 4.效果...

Lucky_Me ⋅ 41分钟前 ⋅ 0

IntelliJ IDEA 乱码解决方案 (项目代码、控制台等)

文章介绍了idea下,项目乱码、控制台乱码及运行tomcat控制台乱码的解决方案,文章链接:https://www.cnblogs.com/vhua/p/idea_1.html

Funcy1122 ⋅ 44分钟前 ⋅ 0

IDEA使用sonarLint

一、IDEA如何安装SonarLint插件 1.打开 Idea 2.点击【File】 3.点击【Settings】 4.点击【Plugins】 5.在搜索栏中输入“sonarlint”关键字 6.点击【Install】进行安装 7.重启Idea 二、IDEA如...

开源中国成都区源花 ⋅ 49分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部