我正试图通过他们的驱动API从Google Drive导出一个文档,文档中有example个,但我没有任何运气.

这是我的代码:

@RequestMapping(value = "/test", method = RequestMethod.GET, produces = MediaType.APPLICATION_PDF_VALUE)
public ByteArrayOutputStream downloadSlidesAsPdf(@RequestParam String fileId) throws IOException {
    OutputStream outputStream = new ByteArrayOutputStream();
    driveService.files().export(fileId, "application/pdf").executeMediaAndDownloadTo(outputStream);

    return (ByteArrayOutputStream) outputStream;
}

执行此操作将导致控制台中出现警告:

WARN  o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Resolved [org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.io.ByteArrayOutputStream] with preset Content-Type 'null']

我试着在请求中添加HttpServletResponse,将内容类型设置为application/pdf,并将输出流设置为这样:

driveService.files().export(copiedFile.getId(), "application/pdf")
            .executeMediaAndDownloadTo(response.getOutputStream());

这是可行的,但它下载的文件没有扩展名,此外,我宁愿它的工作,因为它的设计,而不是与一堆不必要的解决办法.

我还try 了一个中途解决方案,在该解决方案中,我将HttpServletResponse内容类型设置为application/pdf,然后在第一次try 时try 返回ByteArrayOutputStream,但没有成功.

推荐答案

问题是在OutputStream中没有什么可以转换的-我们只写到OutputStream,但不读.

如果控制器需要返回二进制内容,选项如下:

  • 字节[]
  • org.springframework.core.io.源(InputStreamResource、ByteArrayResource、FileSystemResource等)
  • org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody-我自己的偏好

Java相关问答推荐

LocalTime解析截断时间的第二个值

试图弄清楚资源未能在我的Android应用程序中调用关闭警告

Maven Google Sheets版本问题

Quarkus keycloat配置不工作.quarkus. keycloak. policy—enforcer. enable = true在. yaml表示中不工作

基本时态运算的ISO-8601周数据表示法

将关键字与正文中的_Allowed匹配,但带有__Signing可选后缀

SpringBoot+Java 17@Valid未验证POJO

从Spring5迁移到Spring6:无法在雅加达包中找到类

使用UTC时区将startDatetime转换为本地时间

在JDK 1.8源代码中,为什么使用A-B 0来确定哪个更大,而不是A B?

声明带有泛型的函数以用作查找映射中的值

迁移到Java 17后,日期显示不准确

Domino Designer 14中的保存代理添加了重影库

在Oracle JDBC连接中,连接失效和身份验证失效是什么意思?

从12小时开始的日期模式

如果执行@BeForeEach#repository.save(),则测试中的UnitTest最终UUID会发生更改

如何使用jOOQ在PostgreSQL中从枚举类型生成Java枚举

JOOQ:批处理CRUD操作使用动态表定义,如何?

读取ConcurrentHashMap中的可变对象

当我try 返回可选时,Mock无法正常工作