文件上传提示C:\Users\xxxx\AppData\Local\...系统找不到指定的路径问题修复

1、报错案例代码
后端:

	public UploadRes upLoadFile(MultipartFile file, String savePath) {
		UploadRes uploadRes = new UploadRes();
		try {
			File saveDir = new File(savePath).getParentFile();
			// 判断路径是否存在,如果不存在就创建一个
			if (saveDir != null && !saveDir.exists()) {
				saveDir.mkdirs();
			}

			file.transferTo(new File(savePath));
			uploadRes.setFlag(true);
			uploadRes.setResFilePath(savePath);
			uploadRes.setMsg("文件上传成功");
			uploadRes.setOriFileName(file.getOriginalFilename());
		} catch (Exception e) {
			e.printStackTrace();
			uploadRes.setFlag(false);
			uploadRes.setMsg("文件存储失败");
		}
		return uploadRes;
	}

本例运行时参数
savePath为相对路径/home/upload/aaa.jpg
在执行file.transferTo(new File(savePath))时,报错提示
FileNotFoundException: C:\Users\XXX\AppData\Local\Temp\tomcat.9095.675054628671612619\work…(系统找不到指定的路径)。

2、修改后代码示例

public UploadRes upLoadFile(MultipartFile file, String savePath) {
		UploadRes uploadRes = new UploadRes();
		try {
//			File saveDir = new File(savePath).getParentFile();
//			// 判断路径是否存在,如果不存在就创建一个
//			if (saveDir != null && !saveDir.exists()) {
//				saveDir.mkdirs();
//			}
//
//			file.transferTo(new File(savePath));
			// 相对路径转绝对路径进行保存,防止相对路径找不到临时文件
			File dest = new File(new File(savePath).getAbsolutePath());
			if (!dest.getParentFile().exists()) {
				dest.getParentFile().mkdirs();
			}
			file.transferTo(dest);
			uploadRes.setFlag(true);
			uploadRes.setResFilePath(savePath);
			uploadRes.setMsg("文件上传成功");
			uploadRes.setOriFileName(file.getOriginalFilename());
		} catch (Exception e) {
			e.printStackTrace();
			uploadRes.setFlag(false);
			uploadRes.setMsg("文件存储失败");
		}
		return uploadRes;
	}

此时运行提交,代码没有报错,文件上传成功。
运行时new File(savePath).getAbsolutePath()后,可以debugger看到文件路径为D:\home\upload\aaa.jpg

3、问题分析:
可以通过参数看到,错误案例时,上传文件的路径为相对路径。成功的案例因为多new File转为绝对路径。
file.transferTo(dest);会根据dest文件的实例化路径去做处理。判断如果是相对路径,则使用temp目录,就是上诉报错的C:\Users\XXX\AppD…。如果是绝对路径就可以找到直接运输保存到新文件。

当然本例仅为file.transferTo(dest)方法的修复,也可以通过其他方式,
如:引入

commons-io
commons-io
2.5

调用如下的方法
FileUtils.copyInputStreamToFile(MultipartFile.getInputStream(),destFile);
经过调试应该也是可以的。

学海无涯苦作舟!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值