我正在尝试使用基于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()
}
}
以下是我发送文件的方式:
答案 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'
}