2013第38周日Java文件上传&下载收集思考
感觉文件上传及下载操作很常用,之前简单搜集过一些东西,没有及时学习总结,现在基本没啥印象了,今天就再次学习下,记录下自己目前知识背景下对该类问题的理解和认识。
文件上传或下载本质上是从本地到服务器端或服务器到本地之间的网络文件流传输,一般都利用FTP或HTTP协议,里面会涉及到几个关键问题就是文件大小、文件类型、编码传输方式,断点续传等。
java web 文件上传使用html 的<input type=”file” name=”xxx”> 标签,提交form 的几个属性必须为: method=post encType=multipart/form-data;method 属性必须设为post的原因是:值不是放在URL之后传递到服务器的;encType属性:这个属性管理的是表单的MIME编码几个属性详解:

1) application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。

2) multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。

3) text/plain:这种方式主要适用于直接通过表单发送邮件的方式。

文件上传原理是,通过为表单元素设置enctype=”multipart/form-data”属性,让表单提交的数据以二进制编码的方式提交,在接收此请求的Servlet中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。

Java领域中,有两个常用的文件上传项目:

一个是Apache组织Jakarta的Common-FileUpload组件;

http://commons.apache.org/fileupload/

另一个是Oreilly组织的COS框架;

http://www.servlets.com/cos/

利用这两个框架都能很方便的实现文件的上传。

Struts2的文件上传:

Struts2并未提供自己的请求解析器,也就是就Struts2不会自己去处理multipart/form-data的请求,它需要调用其他请求解析器,将HTTP请求中的表单域解析出来。但Struts2在原有的上传解析器基础上做了进一步封装,更进一步简化了文件上传。

Struts2默认使用的是Jakarta的Common-FileUpload框架来上传文件,

因此,要在web应用中增加两个Jar文件:commons-fileupload-1.2.jar和commons-io-1.3.1.jar。它在原上传框架上做了进一步封装,简化了文件上传的代码实现,取消了不同上传框架上的编程差异。

将文件上传组件的JAR文件复制到项目的classpath路径下。

如果要改成其它的文件上传框架,可以修改struts.multipart.parser常量的值为cos/pell,默认值是jakata。并在classpath中增加相应上传组件的类库。

 
 
判断上传文件(单个)大小是否符合服务器设置:
 
(JS快速判断,而不是等二进制流读取完再返回错误信息。)
1.javaScript 客户端脚本判断,但是针对不同的浏览器,不同的权限设置,不一定能成功;(且于服务器端实际读取的文件大小精度有差异,难以靠以上传的流的大小来保证文件是否已经上传完毕)
 
 
1. 服务器即时判断:服务器读取流,直到读取的流的数量大于所设定大的限制,则返回错误信息。(占太多的时间,且浪费服务器资源)
2.服务器端判断:在发送POST请求时,信息头里面都包含 Content-Length 属性,其代表着整个请求的数据长度。我们可以通过简单的判断这个Header数据,发现超过了我们允许的长度则直接断开连接,这样就不会对服务器造成资源浪费。——还必须提交表单,通过request对象获取数据长度,不能通过ajax请求方式来获得待上传文件大小,因为ajax请求传参有URL和json方式,ajax采用post方式请求时只能使用MIMI编码类型为:application/x-www-form-urlencoded
 
 
 
如何判断批量上传的每一个文件的大小:
 
(使用方法二)
 
1. 在客户端判断文件大小,只提交服务器一个文件流,但是文件大小的精确程度会有一定程度的不同,导致一种假死现象;还会有客户端js代码的权限问题。
2. 在服务器端判断文件大小,但是服务器在真实读取文件流之前 ,使用上面的方法二,只能得到整个流的大小,不能得到,单个文件的大小;这样只能实现整个上传进度的统计。而不可能实现多个文件分开计算其精度的方法;
3.每个文件提交一个文件流,服务器对每个流处理时返回文件大小及文件进度。方法是,每个 <input type=”file”> 标签都置于一个独立的form表单中,然后一次提交;
 
服务器如何在真正文件上传(读取流)之前获得文件名?
 
    按照正常的Http上传文件的方式是不能实现的,只有在客户端向服务器提交表单之前先向服务器提交一个Ajax请求,然后服务器调用Ajax请求传递过来 的参数(文件名)来判断是否符合服务器提交要求,如果符合则在客户端的回调函数中提交本文件所属的form表单;如果不符合则返回出错信息;
 
如果文件不合法,服务器、客户端如何而实现:
 
(此时服务器已经必定在读http传递过来的文件流,除非判断文件名是在客户端判断,或者是使用Ajax在服务器端判断的方法)
1、 客户端使用Ajax 接受服务器返回出错信息,并在服务器内部读取流文件时,如果发现文件不合法则抛出特定的异常,并在服务器内部自行捕获处理;
2、 流覆盖;
 
客户端从服务器读取文件上传进度信息:(Ajax)
几个重要的步骤:
1、  构建Ajax 对象,设置回调函数 onreadystatechange;
2、  设置携带特定参数信息的URL;发送请求;
3、  等待回调;
 
需要注意的问题:
1、  IE缓存问题;
解决方法:清除由于IE缓存造成的Ajax不能多次发出请求:
1.服务器端:
response.setHeader(“Cache-Control”,”no-cache”);
1.客户端
在Ajax发出的请求URL后添加一个随机数(Math.random()),这样对于IE来说每次请求的页面都不是同一个页面就不会造成直接调用缓存页面的问题;
2、  同步还是异步请求的问题;
Ajax的优势就是可以异步发送请求到服务器,而不需要服务器实时的去相应,所以设为异步;
 
 
服务器端响应Ajax请求的几个问题:
1、  Ajax异步请求与传统请求在服务器端的判断方法;
1.request.getHeader("x-requested-with");
b.在URL后添加一个与服务器端约定好的参数;
(在服务器端都必须显示的去判断)
2、  字符编码问题;
Ajax请求默认的参数默认均为 ”ISO8859-1”,在服务器端必须要进行解码;
 
UI上传组件应该具备以下基本功能:
1. 能让用户提供一个上传路径
2. 能够限制上载文件的大小(防止上传文件过大)
3. 能够支持多个文件同时上传及限制并行上传文件的个数(多文件并行上传)
4. 可以在服务器端进行异常错误捕获,并进行适当的处理
5. 上传组件的稳定性(上传速度能够保持稳定)
6. 可以设定屏蔽(或指定)固定类型的文件(如以 .exe结尾的文件等)
7. 能够向用户提供一个友好的交互界面,实时显示该文件上传的进度、当前用户的网络状态、上传此文件已花费时间、传输速率,剩余时间等信息
8. 支持对已上传或正在上传文件的删除
9. 用户使用及操作及可扩展 ,并能够灵活的集成到其它项目中
 
 Ajax的同步问题 ;(两个不同的页面同时访问一个服务端URL,导致两者得到的值竟然是后者的值)
 
一个页面的,多表单提交的问题解决方案:
1.  使用Ajax 实现。
2.  使用 form 的target 属性提交到一个本页面的iframe 的name 上,那样页面就不会跳转。
参考:
 

<浅谈上传组件原理与设计 - 天地不仁 - 博客园>

通用 Java 文件上传和下载组件的设计与实现

2013第38周日Java文件上传下载收集思考的更多相关文章

  1. Java文件上传下载原理

    文件上传下载原理 在TCP/IP中,最早出现的文件上传机制是FTP.它是将文件由客户端发送到服务器的标准机制. 但是在jsp编程中不能使用FTP方法来上传文件,这是由jsp运行机制所决定的 文件上传原 ...

  2. java 文件上传 下载 总结

    首先引入2个jar ![](http://images2017.cnblogs.com/blog/1128666/201711/1128666-20171101145630498-2084371020 ...

  3. java文件上传下载

    文件上传首先要引入两个核心包 commons-fileupload-1.2.1.jar commons-io-1.4.jar 下面是对文件上传和下载的一些代码做的一个简单封装,可以方便以后直接使用[使 ...

  4. java文件上传下载组件

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  5. java文件上传下载解决方案

    javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 <form id=" ...

  6. java 文件上传下载

    翻新十年前的老项目,文件上传改为调用接口方式,记录一下子~~~ java后台代码: //取配置文件中的上传目录 @Value("${uploadPath}") String pat ...

  7. [Java] 文件上传下载项目(详细注释)

    先上代码,最上方注释是文件名称(运行时要用到) FTServer.java /* FTServer.java */ import java.util.*; import java.io.*; publ ...

  8. java文件上传下载 使用SmartUpload组件实现

    使用SmartUpload组件实现(下载jsmartcom_zh_CN.jar) 2017-11-07 1.在WebRoot创建以下文件夹,css存放样式文件(css文件直接拷贝进去),images存 ...

  9. [java]文件上传下载删除与图片预览

    图片预览 @GetMapping("/image") @ResponseBody public Result image(@RequestParam("imageName ...

随机推荐

  1. lvs keepalived 安装配置详解【转】

    lvs keepalived 安装配置详解 张映 发表于 2012-06-20 分类目录: 服务器相关 前段时间看了一篇文章,lvs做负载均衡根F5差不多,说实话不怎么相信,因为F5没玩过,也无法比较 ...

  2. linux mysql 数据目录文件夹移动及所遇到的问题

    一 .如果是fedora下用rpm包安装的mysql,修改方法如下: 如果这里说的不够清楚,可以到http://www.vipkj.net/post-839.html给我留言 MySQL默认的数据文件 ...

  3. 20M宽带的网速等价于多少?

    最近有朋友问我:我家的宽带是20兆的,怎么网速这么慢? 运营商说的20M,完整的单位应该是20Mbps(bps:比特率),而日常中所说的下载速度单位是MB,两者是不一样的. 它们之间的换算关系是:1M ...

  4. Android - Ashmem驱动

    以下资料摘录整理自老罗的Android之旅博客,是对老罗的博客关于Android底层原理的一个抽象的知识概括总结(如有错误欢迎指出)(侵删):http://blog.csdn.net/luosheng ...

  5. jQuery自定义组件——输入框设置默认提示文字

    if (window.jQuery || window.Zepto) { /** * 设置输入框提示信息 * @param options * @author rubekid */ var setIn ...

  6. CSS简要内容

    1. 简介 用于布局与美化网页(颜色,字体) CSS语言是一种标记语言,不需编译,可直接由浏览器执行 大小写不敏感 CSS定义由选择符.属性.属性取值组成 格式:selector{property:v ...

  7. Examples_06_02(android)DDMS的data文件中没有显示文件。

    以前这里不显示music.cfg.通过Reset adb,就显示了. 查看虚拟机运行时里面的文件,进入adb.exe目录: E:\TDDOWNLOAD\adt-bundle-windows-x86-2 ...

  8. c# 语句关键字

    1. yield 它表明一个方法,操作符或者get选择器里会出现迭代. 用yield return 同时返回每一个元素,  返回类型必须是IEnumerable, IEnumerable<T&g ...

  9. ajax分页实现,jquery.pagination.js

    1.前台使用ajax无刷新分页,主要需要生成分页的工具条,这里使用的是jquery.pagination.js 插件参数可以参考----张龙豪-jquery.pagination.js分页 下面贴出代 ...

  10. linux RedHat 5 更新vim.

    概述: 想装 ctags,装不上.看到老外有篇日志,是在vi 7.2版本上运行.怕是vi版本的原因,于是想升级,网上升级的方法写得少,有的写的太无语了,只有他自己看得懂.这里,简单说下.搞半天了,终于 ...