通过刷新响应OutputStream下载文件

时间:2017-05-19 16:28:28

标签: java servlets download outputstream flush

我正在尝试以流式方式从Google驱动器下载800 MB文件。就像我从谷歌驱动器&获取字节写入我的响应输出流&冲洗它。这是它的代码

public void downloadFileAsStream(String accessToken, String fileId
            , HttpServletResponse response) throws Exception {
        Credential credential = new GoogleCredential().setAccessToken(accessToken);
        Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).build();
        File file = null;
        try {
            file = service.files().get(fileId).setFields("name, size").execute();
        }  catch (Exception ex) {
            logger.error("Exception occurred while getting file from google drive", ex);
            throw ex;
        }
        long fileSize = file.getSize();
        OutputStream ros = response.getOutputStream();
        for (long i = 0; i<= fileSize; i=i+10000000) {
            byte[] fileRangeBytes = getBytes(service, accessToken, fileId, i, directDownloadThreshold);
            ros.write(fileRangeBytes);
            ros.flush();
        }
        ros.close();
    }

private byte[] getBytes(Drive drive, String accessToken, String fileId, long position, long byteCount) throws Exception {
    byte[] receivedByteArray = null;
    String downloadUrl = "https://www.googleapis.com/drive/v3/files/" + fileId + "?alt=media&access_token="
            + accessToken;
    try {
        com.google.api.client.http.HttpRequest httpRequestGet = drive.getRequestFactory().buildGetRequest(new GenericUrl(downloadUrl));
        httpRequestGet.getHeaders().setRange("bytes=" + position + "-" + (position + byteCount - 1));
        com.google.api.client.http.HttpResponse response = httpRequestGet.execute();
        InputStream is = response.getContent();
        receivedByteArray = IOUtils.toByteArray(is);
        response.disconnect();
    } catch (IOException e) {
        e.printStackTrace();
        throw e;
    }
    return receivedByteArray;
}

这里的问题是文件没有立即以浏览器的形式下载到浏览器中

相反,我的应用程序只是等待整个文件写入响应的输出流。

那么为什么在我的情况下没有发生对浏览器的刷新,尽管我在for循环中有responseOutputStream.flush(),就像这个问题Java file download hangs

0 个答案:

没有答案