`
huainansto
  • 浏览: 28271 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

JAVA HTTP 无组件 上传文件

    博客分类:
  • JAVA
阅读更多

一. 需求
1.用JAVA实现HTTP的文件上传。
2.显示上传进度条。
二. 问题分析
1.如果使用apache的上传组件common-fileupload.jar进行文件上传,当上传的文件大于服务器的内存SIZE的时候,会生成一个临时文件,文件先保存到临时文件中,然后再从临时文件COPY到到指定的路径,这个时候就会有问题了。
A.上传的进度条是根据上传文件的大小,和已经上传到指定文件的大小来生成的,如果生产临时文件,那么在文件从本地上传到服务器端的这段时间我们是看不到进度条的,看到的只是从服务端的临时文件COPY到目的文件的进度条,理论上在网络上从本地上传到服务器的时间大于从临时文件COPY到目的文件的时间,这样在界面上就会有个很长时间的DELAY,用户根本相应不到这个状态。
B.上传完成以后在临时文件夹中会有个上传文件的临时文件,common-fileupload.jar没有方法去DELETE他(我们也不能手动的去DELETE,因为根本不知道临时文件的名称)。
2.如果使用JAVA的无组件上传,复杂的HTTP头将是很头疼的。
A.实现个demo来分析HTTP上传的格式。
这段是上传的jsp code,

上传然后得到上传头的格式为:
-----------------------------7d91463b90688
Content-Disposition: form-data; name="p1"

li
-----------------------------7d91463b90688
Content-Disposition: form-data; name="p2"

heng
-----------------------------7d91463b90688
Content-Disposition: form-data; name="f1"; filename="D:\HelloWorld.java"
Content-Type: text/plain

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class HelloWorld extends MIDlet
{

}
-----------------------------7d91463b90688--

FORM表单的各个字段是由一连串的减号(-)字符后跟上一个随机产生的十六进制数字序列组成,这种分割线就称为MIME分割线。
字段名称和值之间用空行分割,最后一行是在组成分隔符的字符序列再加上两个减号(-)组成。所以如果得到的字符串序列为这个结束符时,就表示上传文件结束。
在分割线之间的内容就是一个表单字段元素的信息,但是除了第一个分割线外,所有分割线前面都有一个回车换行符;除了最后一个分割线以外,每个分割线后面都有个回车换行符,使用二进制工具可以看到回车换行符是"0D 0A"
这些回车换行符不是表单字段的元素的信息,所以在提取这些表单元素的信息的时候要考虑这些回车换行符。

非文件类型的字段元素的描述头部分包括字段元素的名称,格式如下:
Content-Disposition: form-data; name="p1"

文件类型的字段元素的描述头部分包括除了含有字段的名称外,还含有上传文件的文件名称和文件类型,格式如下:
Content-Disposition: form-data; name="f1"; filename="D:\HelloWorld.java"
Content-Type: text/plain

我们可以分析这些字符串来得到文件名称等格式信息,但是注意在IE下和FF下得到的文件名称是不同的,IE下我们可以得到完整的文件路径名,而在FF下我们只能得到文件的名称,这个在编码的时候也需要考虑。

在上传的时候我们一定要用byte[] 数组的形式来传递上传数据,这样就不会有文件的编码问题。这样就产生了一个问题,就是我们既要得到一行数据的String,又想得到他的byte[]的形式。所以我们定义了如下的方法
byte[] bytes = new byte[4096]; //定义一个buffer来存放一行数据的字节数组
int[] count = new int[1]; //定义个长度为1的int[],用这个数组来返回buffer中byte的长度
这里使用int[] 而不使用int是因为,java是传值调用,使用int的时候没有办法去得到这个int的返回,但是用数组,相当是C中的指针的调用。这样一个方法就可以有几个东西来返回了。
我们可以使用encoding的编码格式来为得到的byte[]生成String,这些String就是用来是分隔符比较,判断是否已经结束。
public String readLine(ServletInputStream sis, byte[] bytes, int[] count, String encoding)

在SAVE上传数据的时候有个DELAY,就是当下一行得到的String不等于结束分隔符的时候,就SAVE上一行得到的所有byte[]。
当等于结束分隔符的时候,保存在上一行得到的byte[]的时候,要rm最后两个byte,因为这个是由于分割线产生的回车换行符,这个不是我们需要的。
然后跳出循环,这个时候上传的文件就完全保存成功了。

UploadServlet.java code:

分享到:
评论
1 楼 yinger_fei 2011-04-10  
如果有组件上传,但是没有用servelt实现和jsp里的那个enctype="multipart/form-data">  
属性,那么httpclient可以实现么?

相关推荐

    Java无组件上传Java无组件上传

    根据给定的信息,我们可以深入探讨“Java无组件上传”这一主题。从标题和描述中可以看出,这主要聚焦于如何在不依赖额外库的情况下实现文件上传功能。以下将详细阐述相关的关键知识点。 ### Java无组件上传简介 ...

    java文件上传组件包

    接口提供了获取上传文件的方法,如`getPart()`或`getParts()`,用于获取请求中的多部分数据。 2. **Multipart解析**:在HTTP协议中,文件上传通常使用`multipart/form-data`编码方式。Java的Servlet 3.0及以上版本...

    性能最好的Java文件上传组件

    Apache Commons FileUpload是Java社区广泛使用的文件上传组件,它允许开发者轻松地处理HTTP请求中的多部分表单数据,包括文件上传。然而,对于云存储的集成,我们通常需要结合云服务商提供的SDK,比如腾讯云的Java ...

    java实现文件批量上传

    接口提供了处理上传文件的方法。通常,我们使用Servlet 3.0及以上版本的API来处理这部分工作,因为它们对文件上传提供了更好的支持。 在EXT中,我们可以创建一个包含文件上传控件的表单。EXT的`Ext.form.Panel`可以...

    java上传,下载组件

    7. **安全性**:在上传和下载过程中,组件应考虑安全问题,如防止恶意文件上传、校验文件类型、重命名上传文件以避免覆盖现有文件等。 8. **多线程处理**:为了加速文件上传和下载,组件可能使用多线程技术,同时...

    java文件上传组件包(fileupload)

    多部分数据是HTTP协议中用于上传文件的一种格式,通常在HTML表单中通过`enctype="multipart/form-data"`属性启用。该组件支持分块上传,对于大文件,它能够有效地将文件分割为小块,从而避免一次性加载整个文件到...

    无组件上传源代码,并且能将文件名写入ACCESS数据库

    在IT领域,无组件上传是一种常见的文件上传技术,它避免了使用特定的控件或组件,如ActiveX或Java Applet,使得用户在浏览器端就能完成文件上传操作。这种技术通常依赖于HTML、JavaScript和服务器端脚本语言,如ASP...

    快速,高效,支持大文件的无组件上传

    HTML5的File API是实现无组件上传的关键技术,它提供了读取、处理和上传文件的接口。例如,`FileReader`对象用于读取文件内容,`FormData`对象用于封装文件数据以便通过AJAX发送到服务器,`FileList`对象则列出了...

    JAVA文件上传组件包

    一款很好用的JAVA文件上传组件包,能够轻松实现文件的上传和下载,很好用的

    无组件上传!!无组件上传!!

    无组件上传技术是一种在网页或应用中实现文件上传的方式,它并不依赖于特定的前端组件,如Flash、Java Applet或ActiveX控件。这种技术通常利用HTML5的File API和Ajax异步通信来实现,使得用户可以在不安装额外插件的...

    java Swing 文件批量上传 DEMO 源代码

    总的来说,这个Java Swing 文件批量上传DEMO涵盖了Java GUI编程、文件I/O、网络编程、多线程以及用户交互等多个方面,对于初学者来说,是一个很好的实践项目,可以帮助他们深入理解Java Swing的应用及文件上传的实现...

    JAVA源码Java文件上传组件COSJAVA源码Java文件上传组件COS

    JAVA源码Java文件上传组件COSJAVA源码Java文件上传组件COS

    无组件上传系统(亲测,上传速度飞快)

    1. **无组件上传**:传统上传方式往往依赖Flash、Java Applet或ActiveX等浏览器插件,但这些组件存在安全风险且不适用于所有浏览器。无组件上传系统则利用HTML5的File API和AJAX技术,实现了在现代浏览器中的直接...

    带进度条的文件上传下载组件(JAVA)

    10. **服务器配置**:根据实际部署环境,可能还需要调整服务器的配置,比如设置最大上传文件大小、超时时间等。 通过以上知识点的整合,我们可以构建一个高效且用户友好的文件上传下载系统,提供带进度条的交互体验...

    jsp无组件文件上传

    - `count`:已上传文件数量计数器。 - `b`:字节数组,用于缓存读取的数据。 - `successful`:标记文件上传是否成功的布尔值。 - `fields`:`Hashtable`,用于存储表单字段及其值。 2. **setter方法**: - `...

    无组件上传模块

    这种技术的实现基于浏览器与服务器之间的HTTP协议交互,使得用户能够在Web应用中上传文件,而无需在客户端安装Flash、Java Applet或其他第三方插件。以下是对这一技术的详细说明: 1. **ASP基础**:ASP是微软开发的...

    jsp无组件上传 纯源码

    在Java服务器页面(JSP)开发中,上传文件是一项常见的需求。"jsp无组件上传 纯源码"指的是利用JSP技术实现文件上传功能,而无需依赖任何第三方组件或库,如Apache Commons FileUpload等。这种方法对于学习JSP基础和...

    采用无组件上传的示例

    在IT行业中,无组件上传是一种优化用户界面和提高文件上传效率的技术。传统的文件上传方式通常涉及用户通过网页上的输入元素(如文件选择按钮)选择本地文件,然后浏览器将这些文件作为组件发送到服务器。然而,无...

    java文件上传组件

    - 多部分/形式数据(Multipart/form-data):这是HTTP协议中用于上传文件的一种内容类型,它可以将多个数据部分封装在一个请求中。 2. 常见的Java文件上传库: - Apache Commons FileUpload:这是一个流行的开源...

    java资源Java文件上传组件COSjava资源Java文件上传组件COS

    java资源Java文件上传组件 COSjava资源Java文件上传组件 COS提取方式是百度网盘分享地址

Global site tag (gtag.js) - Google Analytics