赞
踩
以下就是出现问题的代码,会导致只有第一个文件有实际大小,而其他的文件都是0KB,但是有意思的是如果你去查看这些0KB的文件,也是可以查看的,然后在你查看后你再刷新目录就会发现刚刚看过的文件又有了真实大小,但是其他的文件还是0KB。
这样的话一般是查看和调用文件都是没有啥问题的,但是一旦涉及到删除,就会有问题出现,比如刚上传文件后又删除文件,那问题就大了,只会删除第一个有大小的文件,其他的都删除不掉
/** * 上传文件夹 * @param files 多个文件 * @param path 上传的地址路径 */ public static Boolean uploadFileFolder(List<MultipartFile> files,String path){ BufferedOutputStream bos =null; BufferedInputStream bis=null; String[] suffixArr = file_format.split(","); //转换list List<String> suffixList = Arrays.asList(suffixArr); File file=new File(path); if(!file.exists()) { file.mkdirs(); } try { for (MultipartFile mf : files) {//遍历文件夹下的文件 if (!mf.isEmpty()) {//上传的文件不为空 String originalFilename = mf.getOriginalFilename();//获取文件的原名称 String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1); if (!suffixList.contains(suffix)) {//格式限制,非jpg或者png格式的不上传 continue; } bis = new BufferedInputStream(mf.getInputStream()); bos = new BufferedOutputStream(new FileOutputStream(path + originalFilename)); int len = 0; byte[] buffer = new byte[10240]; while ((len = bis.read(buffer)) != -1) { bos.write(buffer, 0, len); } } //刷新此缓冲的输出流,保证数据全部都能写出 if(bos!=null){ bos.flush(); } } return true; }catch (Exception e){ return false; }finally { try { if(bis!=null) { bis.close(); } if(bos!=null) { bos.close(); } } catch (IOException e) { e.printStackTrace(); } } }
这个代码的话讲道理应该是没什么问题的,因为我是调用了flush()的,最后也调用了关闭流。后来实在找不出问题就换了一套方法
代码如下
/** * 上传文件夹 * @param files 多个文件 * @param path 上传的地址路径 */ public static Boolean uploadFileFolder(List<MultipartFile> files,String path){ String[] suffixArr = file_format.split(","); //转换list List<String> suffixList = Arrays.asList(suffixArr); File file=new File(path); if(!file.exists()) { file.mkdirs(); } try { for (MultipartFile mf : files) {//遍历文件夹下的文件 if (!mf.isEmpty()) {//上传的文件不为空 String originalFilename = mf.getOriginalFilename();//获取文件的原名称 String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1); if (!suffixList.contains(suffix)) {//格式限制,非jpg或者png格式的不上传 continue; } mf.transferTo(new File(path +originalFilename)); } } return true; }catch (Exception e){ return false; } }
这个时候如果再去上传的时候就会发现已经没问题了,所有上传的文件都正常了。
然后我去看了一下源码
接着往下追踪 copy()
接着往下追踪
到最后 也是一样的Write() 方法
一路追下来发现和第一套代码没啥区别,最大的区别也就是对于多个文件,每一个文件的InputStream、OutputStream都是close()后新new()的。
之后我根据这个思路就把第一种代码改造了一下。
/** * 上传文件夹 * @param files 多个文件 * @param path 上传的地址路径 */ public static Boolean uploadFileFolder(List<MultipartFile> files,String path){ String[] suffixArr = file_format.split(","); //转换list List<String> suffixList = Arrays.asList(suffixArr); File file=new File(path); if(!file.exists()) { file.mkdirs(); } try { for (MultipartFile mf : files) {//遍历文件夹下的文件 if (!mf.isEmpty()) {//上传的文件不为空 String originalFilename = mf.getOriginalFilename();//获取文件的原名称 String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1); if (!suffixList.contains(suffix)) {//格式限制,非jpg或者png格式的不上传 continue; } BufferedInputStream bis = new BufferedInputStream(mf.getInputStream()); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(path + originalFilename)); int len = 0; byte[] buffer = new byte[10240]; while ((len = bis.read(buffer)) != -1) { bos.write(buffer, 0, len); } bos.flush(); bis.close(); bos.close(); } } return true; }catch (Exception e){ return false; } }
最后测试发现这样的代码也是没有问题的,那么这时候问题大概就出来了,具体用语言文字描述,可能就是对于多个文件来说,可能会需要多个 BufferedInputStream 和 BufferedOutputStream 才可以保证上传没问题。当然这个结果我也只是猜测!
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。