我想使用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;
资源Impl
@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;
}
此代码正在运行,但我想删除服务器端的文件制作,即我想删除文件fil =新文件(&#34; src / main / resources / Sample.pdf&#34;)< / strong>,这是在服务方法中的操作。
提前致谢。
答案 0 :(得分:2)
不使用File,而是使用ByteArrayOutputStream并写入它。然后将结果作为byte []返回,您可以将其传递给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的响应中添加另一个标题。