Spring REST - поврежденный / пустой файл загружается - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь создать конечную точку для рендеринга / обслуживания файла PDF. Я прошел следующие ссылки, чтобы построить API, но все еще сталкиваюсь с некоторыми проблемами.

ссылка 1

ссылка 2

Ниже приведен мой код:

byte[] targetArray = null;

InputStream is = null;

InputStream objectData = object.getObjectContent();

BufferedReader reader = new BufferedReader(new InputStreamReader(objectData));

char[] charArray = new char[8 * 1024];
StringBuilder builder = new StringBuilder();
int numCharsRead;
while ((numCharsRead = reader.read(charArray, 0, charArray.length)) != -1) {

    builder.append(charArray, 0, numCharsRead);
}
reader.close();

objectData.close();
object.close();
targetArray = builder.toString().getBytes();

is = new ByteArrayInputStream(targetArray);


return ResponseEntity.ok().contentLength(targetArray.length).contentType(MediaType.APPLICATION_PDF)
                .cacheControl(CacheControl.noCache()).header("Content-Disposition", "attachment; filename=" + "testing.pdf")
                .body(new InputStreamResource(is));

Когда я запускаю свой API с помощью почтальона, я могу загрузить файл PDF, но проблема в том, что он совершенно пустой. В чем может быть проблема?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Есть несколько способов для загрузки файлов с сервера, вы можете использовать ResponseEntity<InputStreamResource>, HttpServletResponse. Ниже приведены два способа загрузки.

@GetMapping("/download1")
       public ResponseEntity<InputStreamResource> downloadFile1() throws IOException {

          File file = new File(FILE_PATH);
          InputStreamResource resource = new InputStreamResource(new FileInputStream(file));

          return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION,
                      "attachment;filename=" + file.getName())
                .contentType(MediaType.APPLICATION_PDF).contentLength(file.length())
                .body(resource);
       }

OR

Вы можете использовать StreamingResponseBody для загрузки больших файлов. В этом случае сервер записывает данные в OutputStream, а данные браузера считываются, что означает их параллельность.

@RequestMapping(value = "downloadFile", method = RequestMethod.GET)
    public StreamingResponseBody getSteamingFile(HttpServletResponse response) throws IOException {
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment; filename=\"demo.pdf\"");
        InputStream inputStream = new FileInputStream(new File("C:\\demo-file.pdf"));
        return outputStream -> {
            int nRead;
            byte[] data = new byte[1024];
            while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
                System.out.println("Writing some bytes..");
                outputStream.write(data, 0, nRead);
            }
        };
    }
0 голосов
/ 26 апреля 2018

Вы можете попробовать использовать Apache Commons IOUtils. Зачем изобретать велосипед :) 1. Откройте соединение с удаленным сервером 2. Скопируйте inputStream в конечный файл outputStream.

public void downloadFileFromRemoteLocation(String serverlocation, File destinationFile) throws IOException
{
    try (FileOutputStream fos = new FileOutputStream( destinationFile )){
        URL url = new URL(serverlocation);
        URLConnection connection = url.openConnection();
        IOUtils.copy( connection.getInputStream(),  fos);
    } 
}

если вы хотите придерживаться только Java, посмотрите на фрагмент ниже

try {
        // Get the directory and iterate them to get file by file...
        File file = new File(fileName);

        if (!file.exists()) {
            context.addMessage(new ErrorMessage("msg.file.notdownloaded"));
            context.setForwardName("failure");
        } else {
            response.setContentType("APPLICATION/DOWNLOAD");
            response.setHeader("Content-Disposition", "attachment"+ 
                                     "filename=" + file.getName());
            stream = new FileInputStream(file);
            response.setContentLength(stream.available());
            OutputStream os = response.getOutputStream();      
            os.close();
            response.flushBuffer();
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (stream != null) {
            try {
                stream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...