当前位置: 首页 > 知识库问答 >
问题:

在后端使用泽西上传大文件

农存
2023-03-14

我运行一个简单的后端应用程序,允许上传文件。我使用泽西岛并在码头运行它。我的代码部分如下所示:

@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());
    ...

上传工作正常,但我发现该方法是在整个流上传到后端时调用的。因此,例如,如果我发送大文件(要上传3Gigs),我的POST请求会立即出现在后端,但只有当整个3Gigs通过网络上传时才会调用上面的方法。

我想在方法中进行一些检查,并且在某些情况下不上传文件,因此它不需要将整个内容传递到后端,然后将错误消息发送回去。

如何避免将整个文件内容上传到后端,但在开始从数据流读取之前调用该方法?

共有1个答案

彭展
2023-03-14

最终,我解决了客户端应该进行的2个连续POST以上传如此大的文件:

@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 调用,以提供文件大小。如果大小正常,则响应包含第二个 POST 的 URI,以流式传输文件数据。第二种方法可以再次执行文件大小检查(未提供),以确保初始 POST 具有相同的文件大小字段。

 类似资料:
  • 我正在创建一个API上传文件使用泽西。 } } 当我执行curl-v-X POST时——form file=@rt.txt url 我哪里做错了?

  • 我设计了一个多部分Jersey REST服务,如下所示,用于接收多部分请求(文件上传)并将文件保存在磁盘位置: 我的测试客户是: 但我无法得到回应。 当我使用HTML网页作为客户端通过调用REST服务上传文件时,它工作得很好,但从REST客户端它不工作。 客户有什么需要更改的吗?

  • 当我试图上传文件到泽西岛时,我发现下面有一些异常,请帮助我解决。谢谢 html文档:- 阿贾克斯:- Java代码:- 例外情况:- 2015年6月17日下午7:55:34组织。阿帕奇。卡塔琳娜。果心StandardWrapperValve调用 请求头:-

  • 这里有很多链接建议使用多部分/表单数据,以及如何在这里上传文件。对于通过CURL命令上载的多个文件的组合,以及接受FormDataMultiPart的REST服务,无法真正找到一个。 当前正在使用的代码如下所示: 我尝试调用该服务的CURL是: 卷曲-X柱“http://localhost:37200/api/sample-批量“-H”接受:应用程序/json“-H”内容类型:多部分/表单数据“-

  • 我无法上传新泽西州的文件。使用泽西1.9。InputStream到达服务时为空。我尝试过将其作为普通表单提交和使用jQuery表单插件的AJAX提交,但结果都是一样的。也没有记录任何异常,这让它更加令人沮丧。 HTML表单 聚甲醛 Eclipse中的依赖层次结构显示mimepull.jar1.6也被引入。 剩下的服务 如果我添加@FormDataParam(“fileupload_name”)Fo

  • 我在Jersey写了一个Rest服务来上传多个文件。如下图所示。但是我需要Restservice类中的属性名,即name=“metadata”和name=“file”。 选择XML文件1: 选择PDF文件2: FormDataContentDisposition仅从表单中提取内容类型、文件名,而不是输入类型名称=“属性。 任何帮助都将不胜感激。 我张贴使用超文本标记语言的请求如下所示。 也发布HT