Issue
I'm trying to export a document from Google Drive via their Drive API, and there's an example of it in the docs, but I didn't have any luck with it.
Here's my code:
@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;
}
Executing this results in a warning in the console:
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']
I tried doing something like adding HttpServletResponse
in the request and setting the content type to application/pdf
and setting the output stream as such:
driveService.files().export(copiedFile.getId(), "application/pdf")
.executeMediaAndDownloadTo(response.getOutputStream());
This works, but it downloads the file without the extension, and besides, I'd rather have it work as it's designed to than with a bunch of unnecessary workarounds.
I also tried a midway solution in which I set the HttpServletResponse
content-type type to application/pdf
, and then try to return the ByteArrayOutputStream
like in the first attempt, but no luck.
Anyone know what I'm missing here?
Solution
The problem is there is nothing to convert in OutputStream
- we only write to OutputStream
, but do not read.
If controller needs to return binary content, the options are following:
- byte[]
- org.springframework.core.io.Resource (InputStreamResource, ByteArrayResource, FileSystemResource, etc)
- org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody - my own preference
Answered By - Andrey B. Panfilov
Answer Checked By - Timothy Miller (JavaFixing Admin)