【问题标题】:Uploading a file using RESTful API based on Grails JAX-RS Plugin使用基于 Grails JAX-RS 插件的 RESTful API 上传文件
【发布时间】:2014-04-23 16:23:59
【问题描述】:

我正在尝试使用基于 Grails 上的 JAX-RS 的 RESTful API 获取文件。该文件是从带有文件输入标签的常规 POST 多部分表单发送的。 (为了发送我使用邮递员谷歌扩展的文件)

但在发送请求后,我收到“HTTP 状态 400 - 错误请求”响应。 我检查了许多教程并完全按照他们的步骤操作,但它不起作用。

这是 REST 服务中处理请求的代码:

import com.sun.jersey.multipart.FormDataParam
import com.sun.jersey.core.header.FormDataContentDisposition;
import org.json.simple.JSONObject

import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse
import javax.ws.rs.Consumes
import javax.ws.rs.FormParam
import javax.ws.rs.GET
import javax.ws.rs.POST
import javax.ws.rs.Path
import javax.ws.rs.PathParam
import javax.ws.rs.Produces
import javax.ws.rs.QueryParam
import javax.ws.rs.core.Context
import javax.ws.rs.core.Response;
import javax.ws.rs.core.MediaType
import javax.ws.rs.core.MultivaluedMap

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

@Path('/api/upload/')
class UploadResource {

    @POST
    @Path("/tst")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Produces('application/json')
    public String uploadFile(@FormDataParam("file") InputStream is, @FormDataParam("file") FormDataContentDisposition fileDetail){

       String uploadedFileLocation = "Some Location";

       // save it
       saveToFile(is, uploadedFileLocation);

        JSONObject JObject = new JSONObject();
        JObject.put("Message", "Aha")
        JObject.put("Response", "200")
        JObject.put("Status", "OK")
        return JObject.toJSONString()
    }
}

这是我发送文件的方式:

http://postimg.org/image/x3wfrs6h5/

【问题讨论】:

    标签: java api grails upload jax-rs


    【解决方案1】:

    您可以通过从 Grails 的 WebUtils Holder 访问多部分文件来获取文件,而不是为整个应用程序完全禁用 Grails 的多部分解析器(请参阅:https://code.google.com/p/grails-jaxrs/issues/detail?id=52#c11)。

    @POST
    @Path("/tst")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Produces('application/json')
    public String uploadFile() {
    
        String uploadedFileLocation = "Some Location";
    
        // here is the workaround for issue: https://code.google.com/p/grails-jaxrs/issues/detail?id=52
        GrailsWebRequest request = WebUtils.retrieveGrailsWebRequest()
        MultipartFile multipartFile = request.getRequest().getFile('file')
        def is = multipartFile.inputStream
    
        // save it
        saveToFile(is, uploadedFileLocation);
    
        JSONObject JObject = new JSONObject();
        JObject.put("Message", "Aha")
        JObject.put("Response", "200")
        JObject.put("Status", "OK")
        return JObject.toJSONString()
    }
    

    【讨论】:

      【解决方案2】:

      问题的出现是因为jaxrs插件发起的控制器预先解析了请求,导致报错。

      这个问题是已知的,有一个解决方法:https://code.google.com/p/grails-jaxrs/issues/detail?id=52#c11 但它仍然是 jaxrs 插件的一个已知错误。

      【讨论】:

        【解决方案3】:

        默认情况下,Grails 定义了一个名为“multipartResolver”的 bean,为 CommonsMultipartResolver,但根据 Denny 详述的原因,这不适用于 jax-rs。

        我看到他提出的使用 GrailsWebRequest 的唯一问题是,如果您转到 YOUR_APP_URL/application.wadl,您将看不到那里的文件参数,因此自动生成的客户端代码将不起作用。

        我所做的是在 resources.groovy 中将其覆盖为:

        multipartResolver(org.springframework.web.multipart.support.StandardServletMultipartResolver) { bean ->
           bean.autowire = 'byName'
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-26
          • 2014-11-06
          • 1970-01-01
          • 2011-07-08
          • 1970-01-01
          • 2014-09-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多