SpringMVC的MultipartHttpServletRequest

@RequestMapping("/upload")
    public String upload(MultipartHttpServletRequest request) {
        MultipartFile file = request.getFile("upfile");
        File distFile = new File(request.getSession().getServletContext().getRealPath("/") + "template/" + file.getOriginalFilename());
        distFile.renameTo(new File("u"+new Date().toString()));//更新文件名
        try {
            file.transferTo(distFile);//把文件写到服务器
        } catch (IllegalStateException | IOException e1) {
            e1.printStackTrace();
        }

在开发Web应用程序时比较常见的功能之一,就是允许用户利用multipart请求将本地文件上传到服务器,而这正是Grails的坚固基石——SpringMVC其中的一个优势。Spring通过对ServletAPI的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请求,就表明在控制器实例中存在一个实现MultipartHttpServletRequest接口的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)方法将上传文件写到服务器上指定的文件。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,337评论 19 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,679评论 1 92
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,052评论 6 342
  • 昨晚隐约听到打雷声,早已3月,在沈阳并不奇怪。今早起床已经7点20,8点第一节植物生理,xxx老师的课。出门发现步...
    magzine阅读 1,638评论 0 0
  • 今天是清明节,清明节是我国传统节日,也是重要的祭祀节日,是祭祖和扫墓的日子。 清明节呢家里面每年都会做这边的特色锅...
    李晓威阅读 1,391评论 0 0