`

使用multipart请求处理文件上传

阅读更多

在开发Web应用程序时比较常见的功能之一,就是允许用户利用multipart请求将本地文件上传到服务器,而这正是Grails的坚固基石——Spring MVC其中的一个优势。Spring通过对Servlet API的HttpServletRequest接口进行扩展,使其能够很好地处理文件上传。扩展后的接口名为org.springframework.web.multipart.MultipartHttpServletRequest,其内容如清单7-31所示。 

清单7-31  org.springframework.web.multipart.MultipartHttpServletRequest接口

interface MultipartHttpServletRequest extends HttpServletRequest {

public MultipartFile getFile(String name);

public Map getFileMap();

public Iterator getFileNames();

}

如清单所示,MultipartHttpServletRequest接口简单地扩展了默认的HttpServletRequest接口,并提供一些用来处理请求文件的方法。

7.10.1  使用multipart请求

实际上只要发现一个multipart请求,就表明在控制器实例中存在一个实现Multipart HttpServletRequest接口的request对象。我们可以通过清单7-31所示的方法来访问multipart请求中的上传文件,不过在处理上传文件之前,先来看一下上传表单的内容,如清单7-32所示。

清单7-32  上传表单示例

<form action="upload" enctype="multipart/form-data">

<input type="file" name="myFile" />

<input type="submit" value="Upload! " />

</form>

粗体显示的是需要注意的部分,实际上一个上传表单只需要满足如下两点。

l  enctype属性的属性值设为multipart/form-data。

l  input的type属性的属性值设为file。

在前面的示例中,<input>标签中属性type的值为file,且name属性的值为myFile,之所以需要name属性值,是因为在使用接口MultipartHttpServletRequest的getFile方法时需要使用name属性的值。例如在清单7-33中,代码中的upload操作会从请求中读取上传文件。

清单7-33  读取上传文件

def upload = {

def file = request.getFile('myFile')

// 处理该文件

}

注意getFile方法不会返回一个java.io.File的实例,而是返回org.springframework.web. multipart.MultipartFile的一个实例,关于org.springframework.web.multipart.MultipartFile的详细信息,请参考清单7-34。如果在请求中没有找到文件则getFile方法返回null。

清单7-34  org.springframework.web.multipart.MultipartFile接口

interface MultipartFile {

public byte[] getBytes();

public String getContentType();

public java.io.InputStream getInputStream();

public String getName();

public String getOriginalFilename();

public long getSize();

public boolean isEmpty();

public void transferTo(java.io.File dest);

}

在MultipartFile接口中定义了如下很多有用的方法。

l  使用getSize()方法获得文件长度,以此决定允许上传的文件大小。

l  使用isEmpty()方法判断上传文件是否为空文件,以此决定是否拒绝空文件。

l  使用getInputStream()方法将文件读取为java.io.InputStream流对象。

l  使用getContentType()方法获得文件类型,以此决定允许上传的文件类型。

l  使用transferTo(dest)方法将上传文件写到服务器上指定的文件。

例如,如果上传的文件不为空并且大小不小于1024字节,那么可以按照清单7-35中的代码来实现。

清单7-35  文件上传示例

def upload = {

def file = request.getFile('myFile')

if(file && !file.empty && file.size < 1024) {

file.transferTo( new java.io.File( "/local/server/path/${file.name}" ) )

}

}

直接使用MultipartHttpServletRequest实例可以用来管理文件上传,但实际应用常常需要读取文件内容。

分享到:
评论

相关推荐

    关于使用multipart/form-data做文件上传的一点思考

    `SmartUpload.java`很可能是一个自定义的文件上传工具类,它封装了处理`multipart/form-data`请求的逻辑。通常,这样的工具类会包含解析请求、验证文件大小、类型等方法,以确保安全和有效的文件上传。 3. **Smart...

    上传文件fileupload+解决enctype= multipart/form-data无法传递其他参数

    Apache Commons IO是处理IO操作的工具集,而Commons Fileupload则是专门用来处理文件上传的库,它可以方便地处理`multipart/form-data`编码的表单数据。 以下是关于这个话题的详细知识点: 1. **HTML表单与文件...

    C#使用multipart/form-data示例

    4. **文件上传**:对于文件上传,你需要读取文件内容并将其添加到请求体中。同时,Content-Disposition头部应包含`filename`属性,指示上传的文件名。 5. **HTTP请求**:使用`System.Net.HttpWebRequest`或`System...

    解决java enctype multipart form-data文件上传传值问题

    这段代码展示了如何在不使用特定组件的情况下,处理基于`multipart/form-data`的文件上传请求。关键点包括如何解析文件项、获取文件内容以及处理文件。此外,对于非文件字段的处理也给出了示例。 #### 五、注意事项...

    Spring Multipart工作原理(文件上传到服务器)

    在文件上传时,浏览器会使用这种编码方式将表单数据分割成多个部分,每个部分都有自己的边界,以便服务器可以解析和处理这些部分。Spring框架通过解析这种编码的请求来处理文件上传。 Spring Multipart的核心组件是...

    Delphi7 multipart/form-data实现上传文件

    总的来说,Delphi 7 使用 Indy 10 的 `TIdHTTP` 控件和 `TIdMultipartFormDataStream` 类可以方便地实现 `multipart/form-data` 方式的文件上传。理解这些组件的工作原理和使用方法,对于开发涉及文件交互的Web应用...

    SpringMVC处理multipart请求的示例代码

    SpringMVC处理multipart请求是指在Web应用程序中上传文件和处理表单数据的过程。multipart请求是一种特殊的HTTP请求,它可以将一个表单拆分为多个部分,每个部分对应一个输入域。在一般的表单输入域中,它所对应的...

    C# http系列之以form-data方式上传多个文件及键值对集合到远程服务器

    在C#中,可以使用HttpWebRequest和HttpWebResponse类来实现multipart/form-data方式上传附件与请求参数。首先,需要创建一个HttpWebRequest对象,并设置其Method属性为“POST”,ContentType属性为“multipart/form-...

    HttpServletRequestWrapper应用(二):包装文件上传请求

    文件上传通常通过HTTP的`POST`请求完成,使用`multipart/form-data`编码类型。Servlet 3.0及以上版本提供了`Part`接口来处理这些文件。在`HttpServletRequest`中,我们可以调用`getParts()`方法获取到上传的文件。...

    WebAPIFileUploadDemo通过multipart/form-data方式同时上传文件以及数据包含客户端上传例子

    - 异步处理:使用异步操作处理文件上传,提高用户体验。 - 错误处理:添加适当的错误处理机制,以处理上传失败的情况。 5. **性能优化**: - 分块上传:对于大文件,可以考虑分块上传,减少内存占用和提高上传...

    c#同时上传文件和参数

    在.NET编程环境中,C#是一种常用的编程语言,用于构建各种应用程序,包括Web应用。当涉及到与服务器进行数据交互时,HTTP POST请求是非常常见的...通过学习和理解这个示例,你将能够更好地处理涉及文件上传的HTTP请求。

    文件上传和下载文件上传和下载文件上传和下载

    在Node.js中,可以使用Express框架的multer中间件来处理multipart/form-data类型的上传请求。 - 存储文件:文件接收到后,一般会保存到服务器的文件系统、数据库或云存储服务中。这涉及到文件命名策略、权限控制和...

    Android模拟 HTTP multipart/form-data 请求协议信息实现图片上传

    Android模拟 HTTP multipart/form-data 请求协议信息实现图片上传

    Android 上传文件到c# webservice

    这些库简化了网络通信的处理,支持异步请求,能更好地处理文件上传。 3. **构建POST请求**: - 使用HTTP库,创建一个POST请求。在请求体中,需要包含文件的二进制数据和必要的请求头,如Content-Type(通常为...

    VB上传本地文件到服务器

    首先,VB中的文件上传通常与Web Forms或ASP.NET相关联,虽然这里提到的是VB,但可能指的是VBScript或者VB6,因为这些版本也支持文件上传功能。VBScript通常用于ActiveX控件或Classic ASP页面,而VB6则用于桌面应用...

    C++使用 CHttpFile类,实现HTTP协议下请求数据,实现HTTP协议下多文件上传!VS2013开发,可直接运行!

    4. **HTTP多文件上传**:HTTP协议的多文件上传是通过在请求头中指定`Content-Type: multipart/form-data`来实现的,每个文件被视为一个部分,用特定的边界值分隔。这种方式允许服务器解析请求体,区分出不同的文件和...

    android 文件上传(多个或单个),图片上传

    总结,Android的文件上传涉及文件选择、读取、压缩、转换为流,以及利用Multipart请求将数据发送到服务器。同时,配合JSON数据可以传递更多的业务信息。理解并熟练运用这些技术,能够帮助开发者实现高效且稳定的文件...

    c# 使用WebRequest实现多文件上传.docx

    "C# 使用 WebRequest 实现多...使用 WebRequest 实现多文件上传需要了解相关的知识点,例如 HttpWebRequest、multipart/form-data、封装请求参数等。在实际应用中,我们可以根据需要选择合适的方法来实现多文件上传。

    MultipartHttpServletRequest_文件上传

    在Spring框架中,`MultipartHttpServletRequest`是处理文件上传的关键类之一,它扩展了`HttpServletRequest`接口,提供了处理多部分请求的能力,特别是针对文件上传。 ### MultipartHttpServletRequest简介 在...

    multipartform-data 参数传递

    在Web开发中,`multipart/form-data`是一种用于发送表单数据的编码类型,尤其适用于处理文件上传。此编码方式能够使客户端浏览器将表单中的普通文本字段与文件字段一起发送到服务器端进行处理。 #### 标题解析 - **...

Global site tag (gtag.js) - Google Analytics