使用基于Grails JAX-RS插件的RESTful API上传文件

时间:2014-04-23 16:23:59

标签: java api grails upload jax-rs

我正在尝试使用基于Grails上的JAX-RS的RESTful API获取文件。该文件是从具有文件输入标记的常规POST多部分表单发送的。 (对于发送文件我正在使用postman google extention)

但在发送请求后,我收到“HTTP Status 400 - Bad Request”响应。 我检查了很多教程并完全遵循了他们的步骤,但它没有用。

以下是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/

3 个答案:

答案 0 :(得分:1)

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

@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()
}

答案 1 :(得分:0)

问题发生的原因是jaxrs插件启动的控制器预先解析了请求,这导致了错误。

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

答案 2 :(得分:0)

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

我在他使用GrailsWebRequest的建议中看到的唯一问题是,如果你转到YOUR_APP_URL / application.wadl,你将看不到文件参数,因此自动生成的客户端代码将无效。

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

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