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

带有rest调用的Java spring文件下载代理

宰父远
2023-03-14

我需要用java创建一个rest服务,它将连接到另一个rest服务以下载文件。目前,我只需要将文件从另一个后端传输到客户机,但在将来会进行一些处理/转换。

对于我项目中的所有web服务,我们都使用spring rest(用于提供和使用服务)。

我的问题是,考虑到文件会很大,而且我不想遇到内存不足的错误,什么才是合适的方法呢。

其他一些帖子中的人建议在两端使用流,但这真的有可能吗?为此,我需要先将文件写入磁盘吗?

我当前的文件下载代码(消费者)-

public BackendResponse<byte[]> callBackendForFile(BackendRequest request) {

        String body = null;
        ResponseEntity<byte[]> responseEntity = null;
        URI uri = createURI(request);

        MultiValueMap<String, String> requestHeaders = getHeadersInfo(request.getHttpRequest());

        if (HttpMethod.GET.equals(request.getMethod())) {
            responseEntity = restTemplate.exchange(uri, request.getMethod(),
                    new HttpEntity<String>(body, requestHeaders), byte[].class);
        } else {
            LOG.error("Method:{} not supported yet", request.getMethod());
        }

        BackendResponse<byte[]> response = new BackendResponse<>();
        response.setResponse(responseEntity);
        return response;

    }

我的客户代码(提供商):

@RequestMapping(value = "/file", method = RequestMethod.GET, produces = "application/xml")
    @ResponseBody
    public void downloadFileWithoutSpring(HttpMethod method, HttpServletRequest httpRequest,
            HttpServletResponse httpResponse) {

        BackendRequest request = new BackendRequest(method,
                httpRequest.getRequestURI(), httpRequest.getQueryString(), httpRequest);

        BackendResponse<byte[]> backendResponse = dutyplanService.getFile(request);
        ResponseEntity<byte[]> response = backendResponse.getResponse();

        httpResponse.addHeader("Content-Disposition", "attachment; filename=\"" + "attachment.zip" + "\"");
        httpResponse.getOutputStream().write(response.getBody());
        httpResponse.flushBuffer();
}

注意:由于下载的附件是一个损坏的文件,上面的代码无法正常工作

共有2个答案

向弘懿
2023-03-14

您可以直接在restTemplate中传递HttpServletResponse#getOutputStream(),并在服务器中写入它,而无需保存文件。

public void getFile(HttpServletResponse response) throws IOException {
        restTemplate.execute(
                "http://ip:port/temp.csv",
                HttpMethod.GET,
                null,
                clientHttpResponse -> {
                    StreamUtils.copy(clientHttpResponse.getBody(), response.getOutputStream());
                    return null;
                }
        );
    }

请注意,在调用getFile()之后,您应该像这样关闭输出流response.get输出流。

呼延河
2023-03-14

我认为,只要从另一台服务器接收到文件的字节数组内容,就不需要在服务器上创建该文件。

您可以尝试将产生注释的值更改为值Application/zip(或Application/octet-stream,具体取决于目标浏览器),而不是Application/xml

 类似资料:
  • 我有一个证书文件“cert. p12”和这个证书的密码“yxc123yxc”。有了这个,我可以对网站进行身份验证,下载一个xml文件。 我如何在php中做到这一点?尝试过这样做,但“$响应”是错误的。

  • 我正在使用Reformation 2.0下载文件。问题是未调用<code>使 这是我的界面: 这是我的下载代码:

  • 我正试图用reactJS下载一个xlsx文件,但当我在下载后试图打开我的文件时,我收到了这条消息: “Excel无法打开文件‘file.xlsx’,因为文件格式或文件扩展名无效。请验证文件是否已损坏,以及文件扩展名是否与文件格式匹配。” 这是前端代码: 为什么我得到这个错误?请谁来帮帮我,我被困在这个3周 [编辑1] 我尝试下载的文件是在后端构建的,基本上我获取数据库上的值并使用Apache po

  • 我在从AWS下载上面的文件时遇到了一些麻烦。我试图用CouldBerry Explore和Java下载这个文件,但失败了。aws文档说我需要特殊的处理。(https://docs.aws.amazon.com/amazons3/latest/dev/usingmetadata.html)那么,你能告诉我如何用“:”下载这个文件吗? 以下是我的文件信息。 文件名:“E:\home\temp\test

  • 问题内容: 我有一个REST Web服务,当前公开此URL: http:// server / data / media 用户可以在其中使用以下JSON: 为了创建一个新的媒体元数据。 现在,我需要能够与媒体元数据同时上传文件。最好的方法是什么?我可以引入一个新属性,对文件进行base64编码,但是我想知道是否有更好的方法。 还有使用HTML表单发送的内容,但是我正在使用REST Web服务,并且

  • 问题内容: 我在使用通过相对URL访问的字体时遇到问题。 当我访问网页时,字体不起作用,在控制台中,我得到以下信息: 通过将URL复制/粘贴到浏览器地址栏中来访问文件,这表明它是正确的URL,因为我可以下载字体。 问题答案: 乔纳森·邱(Jonathan Kew)对有关MozillaBugzilla条目的回应的提示: 我相信这是按设计工作的。AIUI,这里的问题是,对于从file:// URI加载