从数据库中下载文件而不将其保存在服务器上
Download the file from database without saving it on server
我想使用球衣从数据库中检索 pdf(存储为 BLOB)api
我使用 mybatis 作为数据库框架。
我可以下载 pdf,但问题是我将输入流作为数据库,我将其作为文件保存到其中,然后在 Response 中传递它,但我不想将该文件保存在服务器中,我想直接将文件保存到下载给用户 .
当前进程:
DATABASE--------> 输入流-----> 文件------------> 添加到响应-----> 用户下载它
retrieving making file passing file user downloads
我想要什么:
DATABASE------------>输入流------------>添加到响应-------->用户下载它
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"),此操作在服务方法中。
提前致谢。
不使用 File,而是使用 ByteArrayOutputStream 并向其写入。然后 return 作为 byte[] 的结果,您可以将其传递给 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 的回复中添加另一个 header。
我想使用球衣从数据库中检索 pdf(存储为 BLOB)api 我使用 mybatis 作为数据库框架。 我可以下载 pdf,但问题是我将输入流作为数据库,我将其作为文件保存到其中,然后在 Response 中传递它,但我不想将该文件保存在服务器中,我想直接将文件保存到下载给用户 .
当前进程:
DATABASE--------> 输入流-----> 文件------------> 添加到响应-----> 用户下载它
retrieving making file passing file user downloads
我想要什么:
DATABASE------------>输入流------------>添加到响应-------->用户下载它
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"),此操作在服务方法中。
提前致谢。
不使用 File,而是使用 ByteArrayOutputStream 并向其写入。然后 return 作为 byte[] 的结果,您可以将其传递给 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 的回复中添加另一个 header。