0

我正在使用 Apache Commons IO 的 IOUtils.copy 在 Google Cloud Storage 上制作现有文件的副本。

问题是:如果文件超过 1 mb 左右,IOUtils.copy将引发异常。低于 1 mb 的文件可以正常工作。

代码片段

            AppEngineFile newFile = null;
            GSFileOptionsBuilder optionsBuilder = new GSFileOptionsBuilder().setBucket("bucket-name")
            .setKey(newFilename).setMimeType("image/jpeg");

    try {

        //currentFile is an instance of a AppEngineFile
        FileReadChannel readChannel = fileService.openReadChannel(currentFile, true);

        newFile = fileService.createNewGSFile(optionsBuilder.build());

        FileWriteChannel writeChannel = fileService.openWriteChannel(newFile, true);

        InputStream inputStream = Channels.newInputStream(readChannel);
        OutputStream outputStream = Channels.newOutputStream(writeChannel);

        IOUtils.copy(inputStream, outputStream);
        outputStream.flush();
        outputStream.close();
        inputStream.close();
        writeChannel.closeFinally();

    } catch (IOException e) {
        log.warning(e.toString());
    }

我还尝试了一种更原始​​的方法:但它也不起作用

byte[] buffer = new byte[1024];
int len = inputStream.read(buffer);
while (len != -1) {
    outputStream.write(buffer, 0, len);
    len = inputStream.read(buffer);
}

我现在的假设:App Engine 平台存在某种限制。

注意:我也尝试过IOUtiles.copyLarge(这适用于大于 2 GB 的文件),但它也不起作用。

4

1 回答 1

0

尝试使用小于 1mb 的缓冲区。最新的 appengine 版本减少了缓冲区大小。

于 2013-05-28T04:35:52.657 回答