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

从GCS获取文件,无需本地下载

司空昊阳
2023-03-14

我有一个简单的Spring Boot微服务,负责向/从Google Cloud Storage上传、检索和删除图像。我的服务中的get请求有以下代码:

public StorageObject getImage(String fileName) throws IOException {
    StorageObject object = storage.objects().get(bucketName, fileName).execute();
    File file = new File("./" + fileName);
    FileOutputStream os = new FileOutputStream(file);

    storage.getRequestFactory()
            .buildGetRequest(new GenericUrl(object.getMediaLink()))
            .execute()
            .download(os);
    object.set("file", file);
    return object;
}

这是我的控制器部分:

@GetMapping("/get/image/{id}")
public ResponseEntity<byte[]> getImage(@PathVariable("id") Long id) {
    try {
        String fileName = imageService.findImageById(id);
        StorageObject object = gcsService.getImage(fileName);

        byte[] res = Files.toByteArray((File) object.get("file"));

        return ResponseEntity.ok()
                .contentType(MediaType.IMAGE_JPEG)
                .body(res);
    } catch (IOException e) {
        e.printStackTrace();
        throw new RuntimeException("No such file or directory");
    }
}

就在响应中获取图像而言,这一切都很好,但我的问题是,图像也会下载到项目的根目录中。许多图像将通过此服务上载,因此这是一个问题。我只想在响应中显示图像,而不需要下载它们。我试着玩代码,但没能让它按我想要的那样工作。

共有1个答案

弓玉书
2023-03-14

我建议改为流式下载,同时跳过FileChannel操作:

public static void streamObjectDownload(
    String projectId, String bucketName, String objectName, String targetFile
) {

    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
    try (ReadChannel reader = storage.reader(BlobId.of(bucketName, objectName));
        
      FileChannel targetFileChannel = FileChannel.open(Paths.get(targetFile), StandardOpenOption.WRITE)) {

          ByteStreams.copy(reader, targetFileChannel);
          System.out.println(
              "Downloaded object " + objectName
                  + " from bucket " + bucketName
                  + " to " + targetFile
                  + " using a ReadChannel.");
        }

    } catch (IOException e) {
        e.printStacktrace()
    }
}

人们可以例如。从随机访问文件中获取FileChannel

RandomAccessFile file = new RandomAccessFile(Paths.get(targetFile), StandardOpenOption.WRITE);
FileChannel channel = file.getChannel();

虽然Spring框架同样有一个GoogleStorageResources

public OutputStream getOutputStream()引发IOException,返回Google云存储文件的输出流。

然后从OutputStream转换为int[](这可能是二进制或ASCII数据):

int[] bytes = os.toByteArray();
 类似资料:
  • 我试图从一个简单的文本文件中获取地址,这样不理解代码的人仍然可以添加/删除或更改地址。 Phpmailer工作完全正常,当我设置一个地址,直接写在代码中,甚至与数组和Foreach。 所以现在我有这个: mail.php: mail.txt: echo确实返回了两个地址,但是var在addAddress()行中似乎不起作用,我得到了一个常见的错误:Mailer error:您必须至少提供一个收件人

  • 问题内容: 我需要一种从本地文件夹中获取所有图像的方法,以便在本地也可以运行演示文稿。由于这是不可能的,服务器将不会尝试从本地文件夹中获取图像。 我需要使用.js,因为它无法在本地PC上运行,因此无法使用.php(这样会更容易)。 说我需要从 学习中 获取所有图像 / 问题答案: 我认为您最好的选择是在Javascript中使用新的File API。是具有很多从文件系统读取文件的功能。 (代码从这

  • 我正在google-app-Engine上运行一个应用程序。 尝试从google-cloud d-store上的pdf-file获取txt。 当我在本地运行代码时,它会成功,但当在appengine上运行时,它会在org上失败。pdfbox。例外情况。包装异常 这是我的代码: 代码在with-没有添加其他消息:( 从存储器下载—实际上成功了。如果我记录数据,我会得到如下结果: 现在有没有办法克服这

  • 问题内容: 我需要从GCS存储桶中读取文件。我知道我必须使用GCS API /客户端库,但找不到任何与之相关的示例。 我一直在GCS文档中参考此链接: GCS客户端库。但是不能真正地削弱。如果有人可以提供一个真正有帮助的例子。谢谢。 问题答案: 好。如果您只是想从GCS中读取文件,而不是从PCollection中读取文件,而是从常规文件中读取文件,并且在使用GCS Java客户端库时遇到问题,还可

  • 请不要使用“tika”作为答案。我已经尝试了这个问题的答案: 如何从PDF文件中提取文本? 我有这个PDF文件,https://drive.google.com/file/d/1aUfQAlvq5hA9kz2c9CyJADiY3KpY3-Vn/view?usp=sharing,我想复制文本。 输出为“提交日期:2019-10-21 16:03:36.093 |表单键:5544”,这只是文本的一部分

  • 目前使用SWING实现一个JMenuBar,其中有两个不同的JMenu。一个叫做gameMenu,另一个叫做addMenuGame。 我在游戏菜单中有几个JMenuItems,都是用这个方法在我的界面控制器中实现的。 它所做的是从文本文件中读取每一行,并将其添加到JMenu,称为gameMenu。但是,我只能将actionlisteners添加到JMenu,而不能添加JMenuItem,即JMen