getOriginalFilename方法与“文件名、目录名或卷标语法不正确”别的网友那里搬过来的

细看一眼,好像有问题,这个文件的路径有错,前面是带有盘符的路径信息,后面又有盘符的路径信息

查看代码后,发现问题的症结

/**
 * 文件保存方法
 * @param file
 * @param destination
 * @throws IOException 
 * @throws IllegalStateException 
 */
private void saveFile(MultipartFile file, String destination) throws IllegalStateException, IOException {
	// 获取上传的文件名称,并结合存放路径,构建新的文件名称
	String filename = file.getOriginalFilename();
	
	File filepath = new File(destination, filename);
	
	// 判断路径是否存在,不存在则新创建一个
	if (!filepath.getParentFile().exists()) {
		filepath.getParentFile().mkdirs();
	}
	
	// 将上传文件保存到目标文件目录
	file.transferTo(new File(destination + File.separator + filename));
}

代码中file.getOriginalFilename() 获取上传的文件名称,但是在IE11/Edge浏览器下面,获取到的路径信息带有盘符

查看该方法定义

/**
 * Return the original filename in the client's filesystem.
 * <p>This may contain path information depending on the browser used,
 * but it typically will not with any other than Opera.
 * @return the original filename, or the empty String if no file has been chosen
 * in the multipart form, or {@code null} if not defined or not available
 * @see org.apache.commons.fileupload.FileItem#getName()
 * @see org.springframework.web.multipart.commons.CommonsMultipartFile#setPreserveFilename
 */
@Nullable
String getOriginalFilename();

最上面两句含义便是,该方法返回文件在客户端文件系统中的原始文件名称,该名称或许会包含路径信息,这点依赖于浏览器。

由于之前的测试都是在Chrome浏览器,未测试IE11浏览器,故未发现该问题。

修复该问题,在代码中增加浏览器的判断

	// 获取上传的文件名称,并结合存放路径,构建新的文件名称
	String filename = file.getOriginalFilename();
	
	// 文件上传时,Chrome和IE/Edge对于originalFilename处理不同
	// Chrome 会获取到该文件的直接文件名称,IE/Edge会获取到文件上传时完整路径/文件名
	
	// Check for Unix-style path
	int unixSep = filename.lastIndexOf('/');
	// Check for Windows-style path
	int winSep = filename.lastIndexOf('\\');
	// Cut off at latest possible point
	int pos = (winSep > unixSep ? winSep : unixSep);
	if (pos != -1)  {
		// Any sort of path separator found...
		filename = filename.substring(pos + 1);
	}
	
	File filepath = new File(destination, filename);

这段系统路径分隔符的判断,来自于org.springframework.web.multipart.commons.CommonsMultipartFile类的getOriginalFilename() 方法内。增加后,若为带有路径的文件名信息,则截取我们实际需要的文件名信息。

作者:蜗牛-
来源:CSDN
原文:https://blog.csdn.net/magi1201/article/details/86736648
版权声明:本文为博主原创文章,转载请附上博文链接!

原文:https://blog.csdn.net/magi1201/article/details/86736648

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值