docs/Spring全家桶/SpringMVC/SpringMVC如何实现文件上传.md
SpringöԶ·ϴ֧֣רڴwebӦеļϴͨעһɲεMultipartResolveröļ·ϴ֧֡ýӿڶorg.springframework.web.multipart¡SpringΪһļϴṩMultipartResolverӿڵһʵ֣ΪServlet 3.0·תṩһʵ֡
Ĭ£SpringĶ·ϴ֧DzģΪЩϣԼ·SpringĶ·ϴ֧֣ҪwebӦõһ·ÿDzһಿģ̱һ·עMultipartResolverᱻ֮еĶ·ϴԾһԴˡһ䷭IJãmultipartɶ·ǶಿֻСĶע˴
2018-07-26 14:28
ĴչʾʹһͨõĶ·ϴCommonsMultipartResolver
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- ֵ֧һԣֵ֧ļСֽΪλ -->
<property name="maxUploadSize" value="100000"/>
</bean>
ȻҪö·Ҫclasspath·jarʹõͨõĶ·ϴCommonsMultipartResolverҪjarcommons-fileupload.jar
SpringDispatcherServletһಿʱἤĶ·ѵǰHttpServletRequestװһֶ֧·ļϴMultipartHttpServletRequest``MultipartHttpServletRequest㲻Իȡö·еϢĿлøö·ݱ
2018-07-26 14:29
ҪʹûServlet 3.0Ķ·תܣweb.xmlΪDispatcherServletһmultipart-configԪأͨServlet̵ķʹjavax.servlet.MultipartConfigElementעᣬԼԼServlet࣬ʹjavax.servlet.annotation.MultipartConfigע⡣ļС洢λõѡServletעᣬΪServlet 3.0ڽMultipartResolverIJ㼶ЩϢ
ͨһַʽServlet 3.0·תܣͿһStandardServletMultipartResolverӵSpringȥˣ
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
</bean>
2018-07-26 14:30
MultipartResolverɴʱһ̴ȣһļϴıֱϴԣenctype="multipart/form-data"֪ζԶ·ϴıб루encode
<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">
</form>
</body>
</html>
һǴһܴļϴĿҪĿһע@ControllerĿһܵķMultipartHttpServletRequest``MultipartFile
@Controller
public class FileUploadController {
@RequestMapping(path = "/form", method = RequestMethod.POST)
public String handleFormUpload(@RequestParam("name") String name, @RequestParam("file") MultipartFile file) {
if (!file.isEmpty()) {
byte[] bytes = file.getBytes();
// store the bytes somewhere
return "redirect:uploadSuccess";
}
return "redirect:uploadFailure";
}
}
@RequestParamעνӦеĶֶεġУõbyte[]ļݣֻûκ¡ʵӦУܻὫ浽ݿ⡢洢ļϵͳϣĴ
ʹServlet 3.0Ķ·תʱҲʹjavax.servlet.http.PartΪ
@Controller
public class FileUploadController {
@RequestMapping(path = "/form", method = RequestMethod.POST)
public String handleFormUpload(@RequestParam("name") String name, @RequestParam("file") Part file) {
InputStream inputStream = file.getInputStream();
// store bytes from uploaded file somewhere
return "redirect:uploadSuccess";
}
}
2018-07-26 14:30
ʹRESTfulij£ĿͻҲֱύ·ļһڽҲͬáͬǣύļͼıֶΣͻ˷͵ݿԸӸӣݿָΪijضͣcontent type磬һ·ϴܵһǸļڶǸJSONʽݣ
<section> POST /someUrl
Content-Type: multipart/mixed
--edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp
Content-Disposition: form-data; name="meta-data"
Content-Type: application/json; charset=UTF-8
Content-Transfer-Encoding: 8bit
{
"name": "value"
}
--edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp
Content-Disposition: form-data; name="file-data"; filename="file.properties"
Content-Type: text/xml
Content-Transfer-Encoding: 8bit
... File Data ...
Ϊmeta-dataIJ֣ͨϵ@RequestParam("meta-data") String metadataáDzΪJSONʽݵܸͨһӦǿͶ@RequestBodyͨHttpMessageConverterһתһһ
ǿܵģʹ@RequestPartעʵ֣@RequestParamע⽫ʹض·屻HttpMessageConverterתʱǶ·вͬͲ'Content-Type'
@RequestMapping(path = "/someUrl", method = RequestMethod.POST)
public String onSubmit(@RequestPart("meta-data") MetaData metadata, @RequestPart("file-data") MultipartFile file) {
// ...
}
עMultipartFileܹ@RequestParam``@RequestPartע»õģַõݡķ@RequestPart("meta-data") MetaDataΪеͷ'Content-Type'ΪJSONݣȻͨMappingJackson2HttpMessageConverterתضĶ