【问题标题】:File upload issue with Spring MVC RESTSpring MVC REST的文件上传问题
【发布时间】: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


【解决方案1】:

我也遇到了同样的问题,但是当我在没有任何 Header 值的情况下尝试它时,它工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-02
    • 2013-04-08
    • 2017-09-21
    • 2011-07-22
    • 2014-08-12
    • 2010-10-20
    • 1970-01-01
    • 2020-12-23
    相关资源
    最近更新 更多