簡體   English   中英

在Spring MVC中使用文件上傳和表單數據的RESTful PUT

[英]RESTful PUT with file upload and form data in Spring MVC

我正在使用Spring MVC來公開一些RESTful Web服務。 其中一個操作在提交表單時調用RESTful PUT操作。

但是,表單不是普通形式,因為它包含文件輸入以及常規輸入,如文本和復選框。

我已經通過在web.xml添加HiddenHttpMethodFilter來配置Spring以使用RESTful PUT和DELETE。 在我的表單中,我也發送了一個隱藏的_method參數。

所有這一切都適用於DELETE,PUT沒有文件上傳等。當我嘗試使用文件上傳和表格數據進行PUT時,它給了我405

HTTP Status 405 - Request method 'POST' not supported

我的控制器方法如下所示:

@RequestMapping(value = "/admin/cars/{carId}", method = PUT, headers = "content-type=multipart/form-data")
public String updateCar(@PathVariable("carId") String carId, CarForm form) {
    // save and return the right view.
}

我的HTML表單如下所示:

<form action="<c:url value='/admin/cars/${car.id}'/>" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="_method" value="PUT" />
    <input type="text" name="carName" value="${car.name}" />
    <input type="file" name="photo" />
    <input type="submit" />
</form>

我正在努力實現使用PUT的可行性嗎? 如果是這樣,如何讓Spring MVC明白這一點?

添加MultipartFilter 啟用文件上傳HiddenHttpMethodFilter在web.xml(寫在HiddenHttpMethodFilter API文檔, 見注釋 )。

也:

注意:此過濾器是使用DispatcherServletMultipartResolver支持的替代方法,例如,對於具有不使用Spring的Web MVC的自定義Web視圖的Web應用程序, 或者在Spring MVC DispatcherServlet之前應用的自定義過濾器(例如HiddenHttpMethodFilter 在任何情況下,此過濾器都不應與特定於servlet的多部分分辨率結合使用。

(來自MF的文檔,強調我的)

此外, MultipartResolver的bean名稱必須是filterMultipartResolver ,以便MultipartFilter正常運行 (或必須通過<init-param> )。

編輯:

正如我在上一篇評論中所預料的那樣, CommonsMultipartResolver存在一個問題,它默認只支持POST方法。 (實際上, isMultipartContent中的方法以POST形式出現,即使它是PUT,因為在HiddenHttpMethodFilter之前聲明了MultipartFilter。 作為OP注釋 。)下面是extednded類, 它最初使用的是slighlty修改的靜態方法

public class PutAwareCommonsMultipartResolver extends CommonsMultipartResolver {

    private static final String MULTIPART = "multipart/";

    @Override
    public boolean isMultipart(HttpServletRequest request) {
        return request != null && isMultipartContent(request);
    }

    /**
     * Utility method that determines whether the request contains multipart
     * content.
     * 
     * @param request The servlet request to be evaluated. Must be non-null.
     * 
     * @return <code>true</code> if the request is multipart; {@code false}
     * otherwise.
     * 
     * @see ServletFileUpload#isMultipartContent(HttpServletRequest)
     */
    public static final boolean isMultipartContent(HttpServletRequest request) {
        final String method = request.getMethod().toLowerCase();
        if (!method.equals("post") && !method.equals("put")) {
            return false;
        }
        String contentType = request.getContentType();
        if (contentType == null) {
            return false;
        }
        if (contentType.toLowerCase().startsWith(MULTIPART)) {
            return true;
        }
        return false;
    }

}

實際上, PUT接收二進制流而不是多部分數據。 您可以使用org.springframework.web.filter.HiddenHttpMethodFilter使其工作。

如果有人對替代解決方案(使用PUT方法的MultipartResolver)感興趣,例如,為了強制執行Restful樣式,你可能只看一下使用POST的Spring 3.0 FileUpload?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM