1

我已经根据 IBM 文章http://www-01.ibm.com/support/knowledgecenter/SS7K4U_7.0.0/com.ibm.websphere.web2mobile.mobile.application.services.help/为文件上传配置了 REST 通道docs/fileuploader_README.html?cp=SS7K4U_7.0.0%2F8-13-3

import org.apache.wink.common.model.multipart.BufferedInMultiPart;

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
@Path("/upload")
public RestResult upload(BufferedInMultiPart bimp) {
    List<InPart> parts = bimp.getParts();
    // ....
}

我添加了流的测试消耗,只是为了确保请求得到完全处理:

IOUtils.copy(part.getInputStream(), new NullOutputStream());

我已经用非常大的上传测试了整个 - 大约 100MB。我注意到 Websphere 服务器上的内存使用量急剧增加,比上传小文件要大得多。upload我认为这是由于上传后和调用我的函数之前上传的文件被放入内存引起的。

是否可以配置该工具,以便将大文件读入某个临时文件而不是内存?

或者是否可以直接在 REST 通道方法中成为传入的输入流?

我正在使用 Websphere 8.5 和 JAX-WS REST 通道。

4

1 回答 1

2

根据此处找到的 Apache Wink 文档,似乎 BufferedInMultiPart 将完整文件存储到内存中,因此请尝试将 BufferedInMultiPart 替换为 InMultiPart:

import org.apache.wink.common.model.multipart.InMultiPart;

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
@Path("/upload")
public RestResult upload(InMultiPart bimp) {
    List<InPart> parts = new ArrayList<InPart>();
    while(bimp.hasNext()) {
        parts.add(bimp.next());
    }
    // ....
}
于 2014-09-03T14:44:41.470 回答