0

我想使用 jersey api 从数据库中检索 pdf(存储为 BLOB)我使用 mybatis 作为数据库框架。我可以下载pdf,但问题是我将输入流作为数据库保存为文件,然后在响应中传递它,但我不想将该文件保存在服务器中,我希望文件直接到下载给用户。

当前进程:

DATABASE-------> 输入流-----> 文件 ------------> 添加到响应 -----> 用户下载它

         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"),此操作在服务方法中。

提前致谢。

4

1 回答 1

5

不要使用 File,而是使用 ByteArrayOutputStream 并写入它。然后将结果作为字节 [] 返回,您可以将其传递给您的 Response.ok(content)。

没有测试这个,但是像这样:

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 的响应中添加另一个标头。

于 2017-07-09T20:57:40.197 回答