该场景为:当上传文件不满足要求(服务器端检查:如文件超过大小限制,扩展名不正确等),服务器在等待文件上传完成之前立即返回,目的是终止浏览器继续上传。
但是在实际应用中,并不能按上述预想的场景实现,实际情况是:服务器在文件上传过程中关闭响应输出流立即返回,并不能终止浏览器上传,上传的连接依然被保持,浏览器表现为依然在上传文件。
Google后,有一篇帖子或多或少说明了这个问题:[url] http://stackoverflow.com/questions/3107631/how-to-close-a-http-connection-from-the-httpservlet[/url]
ASK:
I'm running a servlet in Tomcat 6.0.26. The servlet accepts file upload from the client by HTTP POST. I'd like to stop the file uploading from the HttpServlet side. I tried the following methods with no luck:
1. close the request inputstream
2. send error code HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE and flush response
3. do 1 and 2 in a Filter
I googled but found no direct answers. Please advise solutions.
Thanks.
Answer:
This is not possible using the standard Servlet nor Commons FileUpload API's. Basically, to be able to abort the connection immediately, you should grab the underlying socket physically and close it. However, this socket is controlled by the webserver. See also this related question:How to explicitly terminate http connection from server with no response header.
Little tests have however confirmed that Commons FileUpload doesn't buffer up the entire file in memory when its size exceeds the limit. It will read the input stream, but just ignore and throw away the read bytes (also the ones which are already read). So memory efficiency isn't necessarily the problem here.
To fix the real problem, you'd basically like to validate the file size in the client side rather than the server side. This is possible with a Java Applet or a Flash Application. For example, respectivelyJumpLoaderandSWFUpload.
测试过程发现,如果上传巨大的文件,服务端(commons-fileupload 实现)会抛出 FileUploadBase$SizeLimitExceededException ,并且服务端立即返回响应;但是浏览器显示仍在上传中(普通html file控件),如果放任其不管,会发现客户端内存不断攀升(并非浏览器进程),服务端内存也不断攀升,直至浏览器失去响应。(因此并非上述帖子中提到的:如果大小超限,服务端在抛出异常后,会将读取的数据丢弃,因为实际看来这些资源并没有被立即释放)。
该问题作为记录,尚待解决……
分享到:
相关推荐
- **上传文件**:服务器接收上传请求,创建数据连接,接收客户端发送的文件数据,保存到服务器,然后关闭连接。 每个过程都涉及到服务器与客户端之间的交互,包括命令解析、数据传输和状态响应。 **4. 流程图** ...
在IT领域,构建一个能够实现文件上传下载的C/S(客户端/服务器)结构网络程序是一项基本但重要的任务。本项目采用TCP(传输控制协议)作为通信基础,为用户提供可靠的文件传输服务。TCP协议以其面向连接、可靠传输的...
当上传中断后,服务器和客户端都保存这个信息,以便下次连接时从断点处继续上传。主要涉及以下两个核心概念: 1. 文件分块:将大文件分成多个小块进行上传,每个块有固定的大小,便于管理和控制。 2. 偏移量记录:...
在处理大文件上传时,ASP.NET需要特别的处理,因为默认情况下,它对上传文件的大小有限制,通常为4MB左右。针对超大文件上传的需求,开发者通常需要采取一些策略来优化和扩展这一功能,同时加入进度条显示可以提升...
基于Python编写的FTP文件传输程序知识点总结 概述 本文将对基于Python编写的FTP文件传输程序进行详细解析,该程序包括客户端和服务端,可以跨平台文件...* 本程序提供了myexit方法,用于终止客户端和服务端的连接。
文件上传是将本地文件发送到远程服务器的过程。在UDP环境下,这通常涉及以下步骤: 1. 客户端选择要上传的文件并将其分割成多个UDP数据报。 2. 每个数据报会被附加上目标服务器的IP地址和端口号,然后发送出去。 3. ...
在现代互联网应用中,大文件上传已经成为常见的需求,而libcurl作为一款强大的URL传输库,提供了丰富的功能,包括文件分片上传和断点续传,使得开发者能够高效地处理大文件上传的复杂情况。本文将深入探讨libcurl在...
1. **文件传输**:能够将客户端发送的文件传输到服务器端指定的位置。 2. **路径选择**:用户可以选择存储文件的具体路径。 3. **冲突处理**:当目标路径存在同名文件时,会询问用户是否更改编写文件名。 #### 关键...
FTP客户端是实现这一协议的应用程序,允许用户连接到FTP服务器,执行文件的上传、下载以及其他管理任务。本资源提供的是一个FTP客户端的源代码,对于学习和理解FTP工作原理以及如何构建自己的FTP客户端应用程序具有...
这种程序设计通常采用客户端/服务器(C/S)架构,结合了MFC(Microsoft Foundation Classes)库来构建图形用户界面,并通过优化的包头重写技术提升文件传输速度。以下是关于这个主题的详细知识点: 1. **C/S架构**...
一组文件存放在中心版本库,这个版本库很像一个普通的文件服务器,只是它可以记录每一次文件和目录的修改,这便使你可以取得数据以前的版本,从而可以检查所作的更改。从这个方面看,许多人把版本控制系统当作一种...
Socket文件上传是网络编程中的一个重要概念,主要用于在不同的网络设备之间传输数据,...通过上述策略和Socket编程技术,我们可以实现稳定且可靠的文件上传服务,确保每个用户上传的文件都能准确无误地保存在服务器上。
- **客户端应用进程突然死掉纠错机制**:客户端进程异常终止后,能够继续之前的传输任务。 - **MQ Server进程突然死掉纠错机制**:即使MQ Server进程异常,也能够通过备份或其他机制恢复服务。 #### 技术细节 ...
2. **文件上传处理**:服务器需要解析multipart/form-data类型的请求,这通常是用来上传文件的。`multer`是一个流行的Node.js库,用于处理这种类型的请求。它会把上传的文件存储到服务器的某个目录,并提供文件信息...
- **异步操作**:为了提供更好的用户体验,文件上传和下载可能需要异步执行,避免阻塞UI线程。可以使用WSAAsyncSelect或WSAEventSelect API实现异步网络操作。 - **安全性**:考虑到安全问题,FTP有FTPS(使用SSL/...
对于jpg图片的发送,FTP客户端需要使用`STOR`命令开始文件上传。在发送命令之前,客户端需要通过`PASV`或`PORT`命令设置数据传输通道。`PASV`模式下,服务器告诉客户端打开一个端口来接收数据;`PORT`模式下,客户端...
本项目基于C语言实现了一个基本的FTP客户端,它提供了文件上传、下载、删除以及目录浏览等功能,使得用户无需借助图形界面即可完成常见的文件操作。 首先,我们需要了解FTP协议的基础知识。FTP是一种应用层协议,...
FTP协议支持ASCII和二进制两种传输模式,并提供了登录认证、文件上传、下载、删除、重命名等功能。 2. C++网络编程: 在C++中实现FTP服务器,首先需要了解套接字(Socket)编程。套接字是网络通信的基本接口,提供...
在C#编程中,文件传输是一项常见的任务...这些文件可能包含了客户端接收文件、库文件(可能包含通用的传输逻辑)以及服务器端发送文件的代码。通过分析这些源码,我们可以更深入地理解如何在实际项目中应用上述知识点。