后端需要对文件进行操作的时候用到了FileInputStream和FileOutputStream两个类
使用多态创建输入输出流对象:
1.通过本地文件创建输入流对象
InputStream inStream = new FileInputStream(new File("C:\\Users\\admin\\abc.pdf"));
2.创建输出对象
//输出的方式1:下载到本地指定目录
OutputStream out = new FileOutputStream(new File("C:\\Users\\admin\\temp.pdf"));
out.write();
//输出的方式2:写入临时文件
File file = File.createTempFile("ppp", ".pdf");
OutputStream out = new FileOutputStream(file);
3.写入数据
//对out对象进行操作即可
byte[] buffer = new byte[1204];
int length;
while ((byteread = inStream.read(buffer)) != -1) {
out.write(buffer, 0, byteread);
}
//如果是临时文件,out对象操作完再对file对象操作即可(上传oss等),使用完记得调用删除方法
//立即删除方法,还有一种是当程序结束时删除方法file.deleteOnExit();
file.delete();
如果是需要返回给前端文件流的形式,然后前端来实现文件的下载使用如下方式:
这里需要注意的点是:接口无返回类型void
@PostMapping("/downFile")
@Transactional(rollbackFor = Exception.class)
@ApiOperation(value = "下载文件", notes = "下载文件", produces = "application/json")
public void downFile(@RequestBody DownloadFileRequest request) throws MalformedURLException {
// 下载网络文件
int byteread = 0;
URL url = new URL(request.getUrl());
try {
HttpServletResponse response = HttpContextUtil.getHttpServletResponse();
//创建url连接对象
URLConnection conn = url.openConnection();
//创建输入流对象
InputStream inStream = conn.getInputStream();
//设置超时时间
conn.setConnectTimeout(3 * 1000);
// 防止屏蔽程序抓取而返回403错误
// conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
// 下载本地的文件放开
// FileOutputStream fs = new FileOutputStream("c:/xxx.pdf");
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + new String("文件名".getBytes()));
response.setContentType("application/octet-stream");
byte[] buffer = new byte[1204];
int length;
while ((byteread = inStream.read(buffer)) != -1) {
//本地下载放开
//fs.write(buffer, 0, byteread);
//写入输出流
response.getOutputStream().write(buffer, 0, byteread);
}
} catch (IOException e) {
e.printStackTrace();
}
}