【发布时间】:2013-02-25 09:27:11
【问题描述】:
我有基于 Spring MVC 的 REST 应用程序。正在尝试上传文件。这是代码sn-p。
webmvc-config.xml
<bean
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
id="multipartResolver">
<property name="maxUploadSize" value="2000000" />
</bean>
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="0" />
<property name="defaultContentType">
<ref bean="htmlMediaType" />
</property>
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
<entry key="file" value="multipart/form-data"/>
</map>
</property>
<property name="defaultViews">
<list>
<bean
class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
<property name="marshaller">
<bean class="org.springframework.oxm.castor.CastorMarshaller" />
</property>
</bean>
</list>
</property>
FileUploadController.java
@Controller
@RequestMapping("/appfiles")
public class FileUploadController {
private String saveDirectory = "C:/Downloads/";
@RequestMapping(value = "/appfiles", method = RequestMethod.POST, consumes="multipart/form-data", produces="application/json")
public ResponseEntity<List<Map<String, String>>> save(
@RequestParam("file") MultipartFile file) {
System.out.println("received file with original filename: " + file.getOriginalFilename());
// List<MultipartFile> files = uploadForm.getFiles();
List<Map<String, String>> response = new ArrayList<Map<String, String>>();
Map<String, String> responseMap = new HashMap<String, String>();
List<String> fileNames = new ArrayList<String>();
if (null != file) {
// for (MultipartFile multipartFile : files) {
String fileName = file.getOriginalFilename();
fileNames.add(fileName);
try {
file.transferTo(new File(saveDirectory
+ file.getOriginalFilename()));
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
responseMap.put("displayText", file.getOriginalFilename());
responseMap.put("fileSize", ""+file.getSize());
response.add(responseMap);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Accept", "application/json");
return new ResponseEntity<List<Map<String, String>>>(response, httpHeaders, HttpStatus.OK);
}
}
当我使用 chrome 扩展“邮递员”时出现以下错误
Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found
org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:163)
org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:139)
org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1020)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:883)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
postname 提交使用以下详细信息完成:
Headers
conent-type: multipart/form-data
Form-data:
file=<filename.txt>
Method=POST
你能告诉我我的代码有什么问题吗?
感谢和问候
【问题讨论】:
-
你是如何发布数据的?
-
我使用 chrome 的 postman 插件作为我的 REST 客户端。我在标题字段中设置了 content-type=multipart/form-data 和 accept=application/json 。使用表单数据字段上传文件。我在表单数据中创建了一个名为“file”的属性并将文件上传到那里。并且在进行“POST”调用时没有设置其他属性。
-
听起来请求缺少表单边界。你有什么方法可以查看实际的 HTTP 请求吗?我感觉您的请求缺少一些关键部分。此外,尝试使用虚拟 HTML 表单发布可能会有所帮助,只需获取关于请求应该是什么样子的基线。
-
扩展我的最后一个 cmets:要检查的内容 - 您在 Content-Type 标头中设置了边界,并且您的边界与正文中使用的内容相匹配。一些解释可以在这里找到:en.wikipedia.org/wiki/MIME#Multipart_messages
标签: spring rest spring-mvc file-upload