Загрузите файл из базы данных, не сохраняя его на сервере

Я хочу получить pdf (сохраненный как BLOB) из базы данных, используя jersey api. Я использую mybatis в качестве базы данных. Я могу скачать PDF, но проблема в том, что я получаю входной поток в качестве базы данных, в которую сохраняю его в виде файла, а затем передаю его в Response, но я не хочу сохранять этот файл на сервере, я хочу, чтобы файл был быть загруженным для пользователя.

Текущий процесс:

БАЗА ДАННЫХ -------> поток ввода -----> Файл -----------> добавить к ответу -----> пользователь загружает его

         retrieving        making file  passing file          user downloads

Что я хочу:

БАЗА ДАННЫХ ----------> поток ввода ------------> добавить к ответу -------> пользователь загружает его

         retrieving         passing file              user downloads

Я хочу удалить создание файла на сервере, так как данные являются конфиденциальными

Ресурсный интерфейс

@GET
@Path("v1/download/{id}")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response downloadFile(@PathParam("id") int id) throws IOException, SQLException;

Ресурс Импл

@Override
public Response downloadFile(int id) throws IOException, SQLException {
    // TODO Auto-generated method stub
    File file = fileUploadService.downloadFile(id);

    ResponseBuilder response = Response.ok(file);
    response.header("Content-Disposition", "attachment;filename=aman.pdf");
    return response.build();
}

Метод обслуживания

@Override
public File downloadFile(int id) throws IOException {
    // TODO Auto-generated method stub
    File fil=new File("src/main/resources/Sample.pdf");
    FileUploadModel fm =mapper.downloadFile(id);
    InputStream inputStream = fm.getDaFile();
    outputStream = new FileOutputStream(fil);
    int read = 0;
    byte[] bytes = new byte[102400000];

    while ((read = inputStream.read(bytes)) != -1) {
        outputStream.write(bytes, 0, read);
    }
    return fil;
}

Этот код работает, но я хочу удалить создание файла на стороне сервера, то есть я хочу удалить File fil = new File ("src / main / resources / Sample.pdf"), эта операция выполняется в методе service.

Заранее спасибо.

1 ответ

Решение

Вместо использования File, используйте ByteArrayOutputStream и запишите в него. Затем верните результат в виде байта [], который вы можете передать в свой Response.ok (контент).

Не проверял это, но что-то вроде этого:

public byte[] downloadFile(int id) throws IOException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    FileUploadModel fm =mapper.downloadFile(id);
    InputStream inputStream = fm.getDaFile();
    int read = 0;
    byte[] bytes = new byte[1024];

    while ((read = inputStream.read(bytes)) != -1) {
        out.write(bytes, 0, read);
    }
    return out.toByteArray();
}

Кроме того, это много байтов для размещения в массиве. Вы можете экспериментировать с тем, что работает для вас, но что-то вроде 1024 будет вполне достаточно.

Возможно, вы также захотите добавить еще один заголовок в свой ответ для Content-Type.

Другие вопросы по тегам