在开发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...
4. **文件上传**:对于文件上传,你需要读取文件内容并将其添加到请求体中。同时,Content-Disposition头部应包含`filename`属性,指示上传的文件名。 5. **HTTP请求**:使用`System.Net.HttpWebRequest`或`System...
压缩包中的子文件名`servlet`和`multipart`可能表示了两个目录,分别存放了与Servlet相关的代码和处理multipart请求的代码。在`servlet`目录下,可能有实现了文件上传功能的Servlet类,而`multipart`目录可能包含了`...
Apache Commons IO是处理IO操作的工具集,而Commons Fileupload则是专门用来处理文件上传的库,它可以方便地处理`multipart/form-data`编码的表单数据。 以下是关于这个话题的详细知识点: 1. **HTML表单与文件...
在文件上传时,浏览器会使用这种编码方式将表单数据分割成多个部分,每个部分都有自己的边界,以便服务器可以解析和处理这些部分。Spring框架通过解析这种编码的请求来处理文件上传。 Spring Multipart的核心组件是...
SpringMVC处理multipart请求是指在Web应用程序中上传文件和处理表单数据的过程。multipart请求是一种特殊的HTTP请求,它可以将一个表单拆分为多个部分,每个部分对应一个输入域。在一般的表单输入域中,它所对应的...
总的来说,Delphi 7 使用 Indy 10 的 `TIdHTTP` 控件和 `TIdMultipartFormDataStream` 类可以方便地实现 `multipart/form-data` 方式的文件上传。理解这些组件的工作原理和使用方法,对于开发涉及文件交互的Web应用...
在C#中,可以使用HttpWebRequest和HttpWebResponse类来实现multipart/form-data方式上传附件与请求参数。首先,需要创建一个HttpWebRequest对象,并设置其Method属性为“POST”,ContentType属性为“multipart/form-...
文件上传通常通过HTTP的`POST`请求完成,使用`multipart/form-data`编码类型。Servlet 3.0及以上版本提供了`Part`接口来处理这些文件。在`HttpServletRequest`中,我们可以调用`getParts()`方法获取到上传的文件。...
- 异步处理:使用异步操作处理文件上传,提高用户体验。 - 错误处理:添加适当的错误处理机制,以处理上传失败的情况。 5. **性能优化**: - 分块上传:对于大文件,可以考虑分块上传,减少内存占用和提高上传...
本文将深入探讨如何使用Retrofit进行GET、POST请求以及文件上传。 ### 1. Retrofit基本概念 Retrofit的核心概念是定义一个接口,该接口描述了HTTP请求的方法、URL和参数。Retrofit会自动将这些接口方法转换成实际...
在.NET编程环境中,C#是一种常用的编程语言,用于构建各种应用程序,包括Web应用。当涉及到与服务器进行数据交互时,HTTP POST请求是非常常见的...通过学习和理解这个示例,你将能够更好地处理涉及文件上传的HTTP请求。
Android模拟 HTTP multipart/form-data 请求协议信息实现图片上传
这些库简化了网络通信的处理,支持异步请求,能更好地处理文件上传。 3. **构建POST请求**: - 使用HTTP库,创建一个POST请求。在请求体中,需要包含文件的二进制数据和必要的请求头,如Content-Type(通常为...
"C# 使用 WebRequest 实现多...使用 WebRequest 实现多文件上传需要了解相关的知识点,例如 HttpWebRequest、multipart/form-data、封装请求参数等。在实际应用中,我们可以根据需要选择合适的方法来实现多文件上传。
4. **HTTP多文件上传**:HTTP协议的多文件上传是通过在请求头中指定`Content-Type: multipart/form-data`来实现的,每个文件被视为一个部分,用特定的边界值分隔。这种方式允许服务器解析请求体,区分出不同的文件和...
总结,Android的文件上传涉及文件选择、读取、压缩、转换为流,以及利用Multipart请求将数据发送到服务器。同时,配合JSON数据可以传递更多的业务信息。理解并熟练运用这些技术,能够帮助开发者实现高效且稳定的文件...
总结,Java SpringBoot实现文件上传主要涉及配置文件设置、创建Controller处理请求、使用`MultipartFile`接口来操作上传文件,并根据实际需求进行文件验证、存储和管理。通过这些步骤,你可以构建出稳定、安全的文件...
在Spring框架中,`MultipartHttpServletRequest`是处理文件上传的关键类之一,它扩展了`HttpServletRequest`接口,提供了处理多部分请求的能力,特别是针对文件上传。 ### MultipartHttpServletRequest简介 在...