相关疑难解决方法(0)

SpringBoot:使用Apache Commons FileUpload上传大型流文件

我试图使用'流'Apache Commons File Upload API上传大文件.

我使用Apache Commons File Uploader而不是默认的Spring Multipart上传器的原因是当我们上传非常大的文件大小(~2GB)时它失败了.我在一个GIS应用程序上工作,这种文件上传很常见.

我的文件上传控制器的完整代码如下:

@Controller
public class FileUploadController {

    @RequestMapping(value="/upload", method=RequestMethod.POST)
    public void upload(HttpServletRequest request) {
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if (!isMultipart) {
            // Inform user about invalid request
            return;
        }

        //String filename = request.getParameter("name");

        // Create a new file upload handler
        ServletFileUpload upload = new ServletFileUpload();

        // Parse the request
        try {
            FileItemIterator iter = upload.getItemIterator(request);
            while (iter.hasNext()) {
                FileItemStream item = iter.next();
                String name = item.getFieldName();
                InputStream stream = item.openStream();
                if …
Run Code Online (Sandbox Code Playgroud)

spring apache-commons apache-commons-fileupload spring-boot

22
推荐指数
2
解决办法
3万
查看次数

通过@Bean 提供的 RestTemplateBuilder 流式上传缓冲完整文件

我正在构建一个用于上传大文件(数 GB)的反向代理,因此想要使用不缓冲整个文件的流模型。大缓冲区会引入延迟,更重要的是,它们可能会导致内存不足错误。

我的客户端类包含

@Autowired private RestTemplate restTemplate;

@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {

    int REST_TEMPLATE_MODE = 1; // 1=streams, 2=streams, 3=buffers

    return 
        REST_TEMPLATE_MODE == 1 ? new RestTemplate() :
        REST_TEMPLATE_MODE == 2 ? (new RestTemplateBuilder()).build() :
        REST_TEMPLATE_MODE == 3 ? restTemplateBuilder.build() : null;
}
Run Code Online (Sandbox Code Playgroud)

和

public void upload_via_streaming(InputStream inputStream, String originalname) {

    SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
    requestFactory.setBufferRequestBody(false);
    restTemplate.setRequestFactory(requestFactory);

    InputStreamResource inputStreamResource = new InputStreamResource(inputStream) {
        @Override public String getFilename() { return originalname; }
        @Override public long contentLength() { return -1; …
Run Code Online (Sandbox Code Playgroud)

streaming spring reverse-proxy resttemplate spring-boot

5
推荐指数
1
解决办法
1866
查看次数