`

使用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实例可以用来管理文件上传,但实际应用常常需要读取文件内容。

分享到:
评论

相关推荐

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

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

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

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

    C#使用multipart/form-data示例

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

    多文件上传功能源码MultipartRequest.

    压缩包中的子文件名`servlet`和`multipart`可能表示了两个目录,分别存放了与Servlet相关的代码和处理multipart请求的代码。在`servlet`目录下,可能有实现了文件上传功能的Servlet类,而`multipart`目录可能包含了`...

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

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

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

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

    SpringMVC处理multipart请求的示例代码

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

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

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

    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. **性能优化**: - 分块上传:对于大文件,可以考虑分块上传,减少内存占用和提高上传...

    快捷使用Retrofit网络请求框架(get请求,post请求,上传文件)

    本文将深入探讨如何使用Retrofit进行GET、POST请求以及文件上传。 ### 1. Retrofit基本概念 Retrofit的核心概念是定义一个接口,该接口描述了HTTP请求的方法、URL和参数。Retrofit会自动将这些接口方法转换成实际...

    c#同时上传文件和参数

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

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

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

    Android 上传文件到c# webservice

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

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

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

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

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

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

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

    java springboot 文件上传,多文件上传.zip

    总结,Java SpringBoot实现文件上传主要涉及配置文件设置、创建Controller处理请求、使用`MultipartFile`接口来操作上传文件,并根据实际需求进行文件验证、存储和管理。通过这些步骤,你可以构建出稳定、安全的文件...

    MultipartHttpServletRequest_文件上传

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

Global site tag (gtag.js) - Google Analytics