背景:在编写接收上传文件的后端接口时,我们可能需要对文件进行一系列的校验工作,如果在写入上传文件到本地(资源服务器)之后才进行校验,是不太合适的,一是浪费带宽二是浪费内存,先将文件通过流的方式转存为临时文件,等校验通过之后再真正写入本地(上传资源服务器),是一个不错的选择

原理:输入输出流写入文件
/** * 临时文件路径前缀 */ private static final String TEMP_FILEPATH = "/opt/temp"; /**
* 转存临时文件(使用后请删除:下面有deleteFile) * * @param multipartFile 待转存文件 * @return
临时文件绝对路径 */ private static String storageTempFile(MultipartFile multipartFile)
{ // 文件无效,无需转存 File toFile = null; if (multipartFile.getSize() <= 0) { return
StringUtils.EMPTY; } else { // 文件原名称 String originalFilename =
multipartFile.getOriginalFilename(); // 文件格式 String fileFormat =
Objects.requireNonNull(originalFilename).substring(originalFilename.lastIndexOf("."));
// 生成文件id String uuid = UUID.randomUUID().toString().trim().replaceAll("-",
""); // 文件全路径(绝对路径+文件名称) toFile = new File(TEMP_FILEPATH + File.separator +
uuid + fileFormat); String absolutePath = null; try { //
获取临时文件所需要转存的文件夹路劲,不存在则创建 absolutePath = toFile.getCanonicalPath(); String
dirPath = absolutePath.substring(0, absolutePath.lastIndexOf(File.separator));
File dir = new File(dirPath); if (!dir.exists()) { dir.mkdirs(); } // 流写入
InputStream ins = multipartFile.getInputStream(); inputStreamToFile(ins,
toFile); ins.close(); } catch (IOException e) { e.printStackTrace(); } //
返回绝对路径 return absolutePath; } } /** * 流写入文件 * * @param inputStream 文件输入流 *
@param file 输出文件 */ private static void inputStreamToFile(InputStream
inputStream, File file) { try { OutputStream os = new FileOutputStream(file);
int bytesRead = 0; byte[] buffer = new byte[8192]; while ((bytesRead =
inputStream.read(buffer, 0, 8192)) != -1) { os.write(buffer, 0, bytesRead); }
os.close(); inputStream.close(); } catch (Exception e) { e.printStackTrace(); }
} /** * 删除本地文件 * * @param file 要删除的文件 */ private static void deleteFile(File
file) { if (file != null) { File del = new File(file.toURI()); del.delete(); } }

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信