`
tianhandigeng
  • 浏览: 374490 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Web上传文件的原理及实现[转]

    博客分类:
  • java
阅读更多

   现在有很多 Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于 java Commons FileUpload 、还有 Struts1.x Struts2中带的上传文件功能(实际上, Struts2在底层也使用了 Commons FileUpload)。在 asp.net中也有相应的上传文件的控件。

虽然现在有很多上传组件可以利用,但是了解 Web上传文件的原理,对于处理突然出现的问题会有很大的帮助,下面就来讲一下通过浏览器上传文件的基本原理。在了解了原理之后,就可以非常容易地自制满足自身需要的上传组件了。

众所周知,在客户端代码中需要使用 <input type='file' name='file' /> 来选择要上传的文件,并上传,代码如上:

< html >
    
< head >
        
< title > upload </ title >
        
< meta  http-equiv ="description"  content ="this is my page" >
        
< meta  http-equiv ="content-type"  content ="text/html; charset=GB18030" >
    
</ head >

    
< body >
        
< form  action ="servlet/UploadFile"  method ="post"
            enctype
="multipart/form-data" >
            
< input  type ="file"  name ="file1"  id ="file1"   />
            
< input  type ="file"  name ="file2"  id ="file2"   />
            
< input  type ="submit"  value ="上传"   />
        
</ form >
    
</ body >
</ html >


从上面的代码可以看出,有两个文件选择框( file1 file2),在上传文件时, <form>标签必须加上 enctype="multipart/form-data",否则浏览器无法将文件内容上传到服务端。下面我们来做个实验。在 Servlet doPost方法中编写如下的代码,如果想使用 asp.net或其他的语言或技术,也可以很容易实现相应的功能。

    public   void  doPost(HttpServletRequest request, HttpServletResponse response)
            
throws  ServletException, IOException
    {
        java.io.InputStream is 
=  request.getInputStream();
        java.io.FileOutputStream fos 
=   new  java.io.FileOutputStream( " d:\\out.txt " );
        
        
byte [] buffer  =   new   byte [ 8192 ];
        
int  count  =   0 ;
        
while ((count  =  is.read(buffer))  > 0 )
        {
            fos.write(buffer, 
0 , count);
        }        
        fos.close();
    }


    上面的功能非常简单,只是通过 request 获得一个 InputStream 对象,并通过这个对象从客户端获得发送过来的字节流(注意,一定要用字节流,因为,上传的文件可能是二进制文件,如图象文件,因此,使用字节流会更通用)。并将这些字节流保存在 D 盘的 out.txt 文件中。然后我们打开 out.txt ,文件的内容如图 1 所示:
                                                                                                 


                                                                                   图1

    由于 out.txt是使用文本形式打开的,并且 file1上传的是 a.jpg(一个图象文件 ),因此,显示的是一些乱码。我们可以不用管它们。只需要看看这些内容的头部。我们很快就可以找到规律。每一个文件内容的头部都由“ -----------------------------30514443229777”分隔,然后是这个文件的属性,如下:

Content-Disposition: form-data; name="file1"; filename="a.jpg"

Content-Type: image/jpeg

其中包含了文件选择框的 name属性,还有上传的文件名( filename字段),要注意的, firefox在上传时,这个 filename属性值只是文件名,如果使用 IE,就是带路径的文件名,如 D:"a.jpg

接下来的规则就和 HTTP的头一样了,以一个空行( "r"n)分隔。后面就是文件的具体内容。现在最关键的文件的结尾,从图 1可以看出,文件的结尾也是“ -----------------------------30514443229777”,因此,可以断定,第一个上传的文件(包括文件头)是夹在两个“ -----------------------------30514443229777”之间的。而“ -----------------------------30514443229777”就是 multipart/form-data协议的分隔符。但这里还有一个最关键的问题。这个分隔符每次上传都不一样,服务端是如何知道每次上传的这个分隔符的呢?

实际上,这个分隔符是通过 HTTP请求头的 Content-Type字段获得,可通过下面的代码输出这个字段值:

System.out.println(request.getHeader("Content-type"));

输出的内容如下:

multipart/form-data; boundary=---------------------------106712230227687

只要在服务端获得 boundary后面的值即可。经过测试, Content-Type中的分隔符号中的“ -”比实际上传的“ -”少两个,不知是怎么回事。不过这没关系,我们可以认为每一个文件块是以 ""r"n—“结尾的,或是直接将从 boundary获得的分隔符加两个“”。而最后结尾的分隔符是“ ---------------------------106712230227687—”,后面多了两个“”。

综合上述,也就是说,一个文件块是以“ ---------------------------106712230227687”开头,以“”结尾,从图 2可以看出这一切。


                                   
                                         图
2

    至于剩下的工作,就是按着上面的规则来分析这些字符流了。分析的方法很多。在这里就不详述了。

 

 

分享到:
评论

相关推荐

    web文件上传原理讲解与代码

    本文将详细介绍Web文件上传的基本原理及其实现方法,并通过具体的代码示例来帮助读者更好地理解和掌握这一技术。 #### 二、HTTP表单上传规范 文件上传的核心是通过HTTP协议完成数据传输。当用户选择文件并提交表单...

    c++实现向web服务器上传文件

    本文将深入探讨如何使用C++实现向Web服务器上传文件,特别是在VS2013环境下,以及与Java Web工程的交互。 首先,我们要了解HTTP协议中的POST方法。在Web应用中,POST请求常用于提交数据到服务器进行处理,例如当...

    C#webapi文件上传下载源码

    在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Web应用程序时,如WebAPI。...通过研究这些源码,开发者可以深入理解WebAPI的工作原理,以及如何在实际项目中安全、高效地处理文件上传和下载。

    通用型Web文件上传JavaBean的实现

    ### 通用型Web文件上传JavaBean的实现:深入解析与应用 #### 一、Web文件上传的基本原理 HTTP协议作为互联网通信的基础,定义了一系列的方法,包括GET、HEAD、POST、PUT、DELETE、TRACE和CONNECT,其中GET和POST...

    ASP.NET(C#) Web Api通过文件流下载文件的实例

    总结一下,本实例展示了如何在ASP.NET(C#) Web API中利用文件流实现文件下载。通过创建HTTP响应,设置正确的响应头,并将文件内容作为流发送,我们可以方便地让客户端接收到文件并保存到本地。这种方法简单、高效,...

    PHP开发环境下文件上传的原理与实现.pdf

    下面将详细论述PHP开发环境下文件上传的原理与实现方法,并对上传文件的格式类型及大小进行限制。 一、PHP简介 PHP(Hypertext Preprocessor的缩写)是一种运行于服务器端并完全跨平台的嵌入式脚本编程语言。PHP...

    基于web的上传文件案例

    首先,我们要理解Web上传文件的基本原理。传统的HTTP表单提交方式在处理大文件时可能会遇到问题,因为它们通常不支持断点续传,且可能导致浏览器崩溃。为了解决这个问题,我们可以采用HTML5中的File API,它提供了对...

    web 多文件上传

    通过以上步骤,你就可以实现一个基本的Web多文件异步上传功能。在实际项目中,你可能还需要考虑错误处理、安全问题(如防止跨站脚本攻击)以及用户体验优化(如使用预览图、上传队列管理等)。记住,良好的前端实践...

    Web文件存储上传.

    本教程将深入讲解如何实现Web文件存储上传。 一、文件上传的基本原理 文件上传是通过HTTP或HTTPS协议实现的,用户选择本地文件后,浏览器会将其封装在表单数据中发送到服务器。在HTML中,可以使用`...

    Web 开发实现文件上传功能

    在Web开发中,实现文件上传功能是常见的需求,特别是在构建交互性强、用户参与度高的网站时。本篇文章将深入探讨如何在不同的Web框架下实现这一功能,并提供一个名为"smartUpload"的工具作为示例。 文件上传是允许...

    web文件上传

    本项目基于Java Web技术,实现了文件从客户端上传到服务器本地的简单流程,这对于初学者理解Web应用程序的工作原理非常有帮助。以下是这个"web文件上传"项目的详细知识点解析: 1. **JSP(JavaServer Pages)**:...

    C#编写的Web大文件上传代码

    总之,C#编写的Web大文件上传代码通过HttpUploadModule实现了高效、可靠的分块上传功能,适用于VS2008开发环境。这个项目不仅展示了C#处理大文件上传的技术,也体现了在ASP.NET Web应用中如何通过自定义模块扩展IIS...

    用C井实现Web文件的上传.rar_C# web 上传_C# 上传_web 文件上传

    首先,我们需要理解Web上传的基本原理。在HTTP协议中,文件上传通常通过POST请求进行,其中包含一个multipart/form-data编码的表单数据。这种编码方式允许我们将文件内容作为二进制数据传输,同时还可以传递其他表单...

    文件上传原理学习

    文件上传是Web应用中常见的功能,用户可以上传图片、文档等各种类型的数据到服务器。这个过程涉及到许多技术细节,包括前端的表单提交、文件API,以及后端的接收处理和存储。下面我们将深入探讨文件上传的原理。 1....

    web方式通过flash批量上传文件

    "Web方式通过Flash批量上传文件"是一种解决方法,它利用了Adobe Flash技术来实现多文件同时上传的功能。本文将深入探讨这个主题,包括其原理、优势以及实现步骤。 Flash技术在过去的网页交互中扮演了重要角色,它...

    Web 应用安全漏洞原理及测试技术

    本篇将详细解析Web应用安全漏洞的原理及测试方法,主要涉及SQL注入、任意文件上传、任意文件下载、文件包含、跨站脚本(XSS)攻击、跨站请求伪造(CSRF)以及逻辑漏洞。 首先,SQL注入漏洞是Web应用中最常见也是...

    Delphi写ASP组件实现快速多文件WEB上传

    标题“Delphi写ASP组件实现快速多文件WEB上传”揭示了一个使用Delphi编程语言创建的ASP(Active Server Pages)组件,该组件旨在提高在Web环境中上传多个文件的效率。这个技术通常用于构建交互性强、用户友好的网站...

    web安全技术-实验六、文件上传漏洞.doc

    【文件上传漏洞】是Web应用安全领域中的一个重要概念,它主要出现在允许用户上传文件到服务器的应用程序中。当系统没有正确地验证或过滤上传的文件类型时,攻击者可以利用这个漏洞上传恶意代码,例如病毒、木马或者...

    Struts2.0文件上传原理

    Struts2.0文件上传原理主要涉及Web应用中处理用户上传文件的功能,这一过程涉及到多个步骤和技术,包括HTTP协议、Multipart/form-data编码、临时文件存储以及后台处理。以下是对Struts2.0文件上传原理的详细解释: ...

Global site tag (gtag.js) - Google Analytics