Java 在后端使用Jersey上载大文件
我运行一个简单的后端应用程序,允许上传文件。我用运动衫在码头上跑步。我的代码如下所示:Java 在后端使用Jersey上载大文件,java,jersey,jetty,Java,Jersey,Jetty,我运行一个简单的后端应用程序,允许上传文件。我用运动衫在码头上跑步。我的代码如下所示: @POST @Consumes(MediaType.MULTIPART_FORM_DATA) public Response uploadFile(@Context UriInfo uriInfo, FormDataMultiPart multipart, @Context HttpServletRequest httpRequest) { FormDataBodyPart fileId = mul
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(@Context UriInfo uriInfo, FormDataMultiPart multipart, @Context HttpServletRequest httpRequest) {
FormDataBodyPart fileId = multipart.getField("fileId");
FormDataBodyPart fileSize = multipart.getField("fileSize");
FormDataBodyPart file = multipart.getField("file");
ContentDisposition cd = file.getContentDisposition();
String fileName = cd.getFileName();
long size = Long.valueOf(fileSize.getValue());
...
Upload工作得很好,但是我发现在整个流被上传到后端时,方法被调用。因此,例如,如果我发送了巨大的文件(需要上传3Gig),我的POST请求会立即出现在后端,但是只有当全部3 Gig通过网络上传时,才会调用上面的方法
我想在方法中做一些检查,在某些情况下不上传文件,因此它不需要将整个内容传递到后端,然后再将错误消息发送回来
如何避免将整个文件内容上载到后端,但在开始读取数据流之前调用该方法 最终,我通过客户端上传如此大的文件所需的两个连续帖子来解决这一问题:
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response newUpload(@Context UriInfo uriInfo, FormDataMultiPart multipart,
@Context HttpServletRequest httpRequest) {
FormDataBodyPart fileSize = multipart.getField("fileSize");
long size = Long.valueOf(fileSize.getValue());
if (!checkSizeLimits(size)) {
return Response.status(Status.BAD_REQUEST).build();
}
// here comes some code which generates an unique id and its URI for the data
...
return Response.status(Status.CREATED).entity(new FileUploadInfo(uri.toString())).build();
}
@POST
@Path("/{fileId}")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(@Context UriInfo uriInfo, FormDataMultiPart multipart,
@Context HttpServletRequest httpRequest, @PathParam("fileId") String fileId) {
FormDataBodyPart fileSize = multipart.getField("fileSize");
FormDataBodyPart file = multipart.getField("file");
//...
return Response.status(Status.CREATED).entity(new FileUploadInfo(uri.toString())).build();
}
它看起来很难看,但比在数据流完全加载后进行文件大小检查要好。因此,客户机应该首先提供文件大小,对newUpload()方法进行POST调用。如果大小正常,则响应包含第二篇文章的URI,以流式传输文件数据。第二种方法可以再次执行文件大小检查(未提供),以确保初始帖子具有相同的文件大小字段。您希望进行哪些检查?我认为您无法对
多部分
实体-IE fileId中的任何内容进行检查,因为这需要首先传输整个实体。@威尔,我想进行一些限制性检查,因此如果文件大小超过某个值或在一段时间内进行了多次上载,请不要接受该文件。事实上,我在过去几天做了一些研究,在整个多部分实体被使用之前,似乎没有办法发送响应:(.它与Jetty无关,但与HTTP有关…您可以避免发出两个请求