RFC1867规范中,对表单上传文件的大小和进度都没有作出规定,W3C的HTML规范的FileUpload对象(<input type="file"> 标签每出现一次,一个 FileUpload 对象就会被创建)也没有对表单中的文件大小作出限制,因此,这个问题还是留给了WEB应用服务器端开发人员。
HTTP请求提交到服务器端后,在未解析各boundary中的文件内容之前,是可以知道这次HTTP请求的总长度的,但是考虑到一个表单内可以容纳多个FileUpload对象,所以,只要发现解析的两个boundary内的字节数超过指定的数量,立即抛出一个运行期异常ThresholdException。重构后的的MultiPartFile类,增加了bytes和threshold成员变量,append方法中新增加3行代码,并且,其子类要显式调用super.append(…);
public void append(byte[] buff, int off, int len) throws IOException {
bytes += len;
if (threshold > 0 && bytes > threshold)
throw new ThresholdException();
}
在开发中,如果程序代码未捕获这个运行期异常,上传文件的过程终止,如果捕获了此异常,并且未让程序终止,上传文件的过程继续,也就是虽然超出了大小限制,但仍然完成了文件上传的过程,文件会被保存到磁盘或者内存中。
对于文件上传的进度,RFC 1867也没有做相应的描述,从文件被编码到发送请求到服务器端,直至文件被解析出来并保存,是一个复杂的过程,RFC未对此做详细描述。浏览器对此功能有一些自主的空间,是先读取所有的文件再编码,还是逐个文件读取逐个编码,还是对文件进行局部编码局部发送,这些方式可以采用同步发送也可以采用异步。
这些复杂未描述的方式,对开发者来说,到底是什么相对于什么的进度,是非常迷惑的。在RFC 1867中,根本就是一个不予以考虑的问题,所以,文件上传的进度,是属于一个很含糊的需求。HTTP是无状态的协议,又缺少了客户端的支持,这个实现这个功能本身,需要不小的资源开销。用一个词来概括这个功能——鸡肋。
尽管如此,未了满足一些对网页特效的要求,FastUpload这个开源组件还是提供了进度的功能,但是,非常有限。只有在表单内仅有一个文件输入组件时才能生效,而且,这个进度受上传请求编码方式的影响,并不精确。
public class ProgressListener {
private FileUploadParser fileUploadParser;
public ProgressListener(FileUploadParser fileUploadParser) {
super();
this.fileUploadParser = fileUploadParser;
}
public double progress() {
return fileUploadParser.getReadBytes()*1.0 / fileUploadParser.getContentLength();
}
}
开发人员在需要了解文件上传进度的时候,才调用progress()函数。
<原创内容,版权所有,如若转载,请注明出处,不胜感谢!仪山湖>
分享到:
相关推荐
在大文件上传时,由于文件大小可能超过浏览器或服务器的限制,传统的HTTP POST方法可能无法胜任。因此,我们需要一种分块上传或断点续传的方法。PHP的`Chunked upload`技术可以解决这个问题,它将大文件分割成多个...
### Nginx文件上传进度显示知识点详解 #### 一、Nginx Upload Progress 模块简介 Nginx 是一款广泛使用的高性能 HTTP 和反向代理 Web 服务器,它以其稳定性、丰富的功能集、示例配置文件和低资源消耗而著称。在文件...
在处理大文件上传时,由于文件大小可能超过浏览器或服务器的限制,因此需要采用分块上传的策略。这意味着文件会被分割成多个较小的部分,然后逐一上传。这种方式可以避免一次性加载整个文件导致的内存压力和网络拥塞...
功能描述: 建立FTP链接 支持代理 多种重载的同步上传文件 多种重载的异步上传文件 多种重载的同步下载文件 多种重载的异步下载文件 上传文件的进度百分比 下载文件的进度白分比 有区分...
在JavaScript中,XMLHttpRequest或者Fetch API提供了监听上传进度的事件,如`progress`事件,可以根据已上传的字节数与总字节数计算出当前的上传进度,并更新UI上的进度条。 再者,图片缩略图的生成通常在客户端...
这个特定的压缩包文件包含了一系列与大文件上传相关的功能,包括但不限于:使用简便的API,显示上传进度条,图片预览(通过生成缩略图),支持断线续传,以及对文件类型、大小和上传数量的控制。以下将详细阐述这些...
每个`MultipartFile`对象代表一个上传的文件,可以获取文件名、类型、大小等信息,并将其保存到服务器上。 2. **Atlassian Struts和Servlet**:如果你的项目使用的是Struts或Servlet,也可以实现类似的功能。Struts...
博客文章可能还会介绍如何在WinForm界面中创建一个进度条控件(ProgressBar),并将上传进度与控件关联。这通常涉及到后台线程或异步操作,以避免阻塞UI。使用`BackgroundWorker`组件或`.NET 4.5`以上的`async/await...
7. **关闭连接**:文件上传完成后,记得断开与FTP服务器的连接,使用`disconnect()`方法。 以下是一个简化的代码示例: ```java FTPClient ftp = new FTPClient(); ftp.connect("ftp.server.com"); ftp.login(...
可以通过监听输出流的写入量,与文件总大小进行比较,从而计算出当前进度。以下是一个简单的示例: ```java long totalSize = file.length(); int progress; byte[] buffer = new byte[1024]; int count; while (...
总结来说,Retrofit2与RxJava结合可以方便地处理文件上传,而通过自定义`RequestBody`和拦截器,可以实现文件上传的进度显示。虽然这个示例没有涉及权限管理,但在实际应用中,确保用户授权访问文件和网络是必不可少...
大多数服务器操作系统(如Linux或Windows Server)都有对单个文件上传大小的默认限制。例如,在Apache或Nginx等Web服务器中,`client_max_body_size`参数控制了上传文件的最大尺寸。在Linux系统中,`ulimit`命令可以...
因此,应限制单个文件大小,设置上传时间限制,并对上传文件进行安全检查,如检查文件类型和内容。 9. 错误处理与用户体验:提供友好的错误提示,如文件类型不支持、文件过大、网络中断等,以提高用户体验。 通过...
前端则通过监听HTTP请求的progress事件,根据接收到的已上传字节数与文件总大小计算出当前进度,实时更新UI。有些浏览器还支持FileReader API,允许前端先读取文件的部分内容,预估文件大小,从而更准确地显示进度。...
- `memory_limit`:虽然不直接与文件上传有关,但大文件上传可能消耗大量内存,所以确保内存限制足够大也很重要。 要更改这些配置,可以在php.ini文件中直接编辑,或者在PHP脚本中使用`ini_set()`函数临时修改。...
实际应用中,你可能还需要处理多文件上传、进度显示、错误处理、跨域上传等问题。例如,你可以使用`FormData`对象来收集多个文件和其他表单数据,然后通过`fetch`或`XMLHttpRequest`发送到服务器。如果需要在上传前...
“上传文件限制大小”则是指在`PHP`后端设定文件上传的最大限制。在`PHP`配置文件`php.ini`中,有两个关键参数可以控制上传大小:`upload_max_filesize`定义了单个文件的最大大小,而`post_max_size`则限制了整个...
1. 文件大小限制:为了防止大文件导致服务器资源耗尽,可以在客户端和服务端都设置文件大小的限制。 2. 文件类型检查:验证用户上传的文件类型,避免上传恶意文件。 3. 多线程上传:对于大文件,可以采用分块上传的...
### 使用JavaScript限制上传文件的大小 在Web开发中,经常需要处理用户上传文件的情况。为了优化用户体验并确保服务器资源的有效利用,通常会设置文件大小的限制。本文将详细介绍如何使用JavaScript来实现对上传...
"上传文件jsweb前端(包含文件格式限制)"这个项目旨在提供一个完整的前端文件上传解决方案,它不仅支持基本的文件上传操作,还包含了对文件格式和大小的严格限制,以确保用户上传的数据符合预设的标准,类似于163...