18.10.4处理表单中的文件上传

MultipartResolver完成其作业之后,请求将像其他处理一样进行处理。 首先,创建一个带有文件输入的表单,允许用户上传表单。 编码属性(enctype =“multipart/form-data”)让浏览器知道如何将表单编码为多部分请求:

<html>
    <head>
        <title>Upload a file please</title>
    </head>
    <body>
        <h1>Please upload a file</h1>
        <form method="post" action="/form" enctype="multipart/form-data">
            <input type="text" name="name"/>
            <input type="file" name="file"/>
            <input type="submit"/>
        </form>
    </body>
</html>

下一步是创建一个处理文件上传的控制器。 除了我们在方法参数中使用MultipartHttpServletRequestMultipartFile之外,这个控制器与标准的@Controller非常相似:

@Controller
public class FileUploadController {

    @PostMapping("/form")
    public String handleFormUpload(@RequestParam("name") String name,
            @RequestParam("file") MultipartFile file) {

        if (!file.isEmpty()) {
            byte[] bytes = file.getBytes();
            // 将字节存储在某个地方
            return "redirect:uploadSuccess";
        }

        return "redirect:uploadFailure";
    }

}

请注意,@RequestParam方法参数如何映射到表单中声明的输入元素。 在这个例子中,byte[]没有做任何事情,但实际上你可以将它保存在数据库中,将它存储在文件系统中,等等。

使用Servlet 3.0多部分解析时,还可以使用javax.servlet.http.Part作为方法参数:

@Controller
public class FileUploadController {

    @PostMapping("/form")
    public String handleFormUpload(@RequestParam("name") String name,
            @RequestParam("file") Part file) {

        InputStream inputStream = file.getInputStream();
        // 从上传的文件中存储字节
        return "redirect:uploadSuccess";
    }

}

results matching ""

    No results matching ""