重庆怎么制作网站?,中国建设工程鲁班奖查询网站,承德市网站建设,新浪sae 安装wordpress一.需求
现在有个需求#xff0c;要通过InputStream流先去判断文件类型#xff0c;然后再上传文件#xff0c;这样就会用到两次InputStream。
二.问题
这个功能之前的同事已经做了一版#xff0c;一直以为是正常的#xff0c;毕竟都很久了#xff0c;但是我用的时候发…一.需求
现在有个需求要通过InputStream流先去判断文件类型然后再上传文件这样就会用到两次InputStream。
二.问题
这个功能之前的同事已经做了一版一直以为是正常的毕竟都很久了但是我用的时候发现上传的文件总是空的只能去仔细看下代码了。
三.排查
try (InputStream in inputStream) {//检验文件CheckFileUtil.checkFile(inputStream, FileUtil.extName(filename));LoggerFactory.getLogger(this.getClass()).info(上传文件的文件名filename);//上传文件String filePathURL saveToDisk(in, FileUtil.extName(filename));FileInfo fileInfo new FileInfo();fileInfo.setId(RandomUtil.simpleUUID());fileInfo.setFileName(filename);fileInfo.setFileType(FileUtil.extName(filename));
之前的代码逻辑是用原来的inputStream去校验然后用赋值后的in去上传文件开始看到这里也没发现有什么问题感觉很正常。
只能去加日志打断点调试了最终发现在校验文件之后不管是inputStream还是in都是空的了恍然大悟。由于流读过一次就不能再读了。
四.解决
开始想着去复制一遍这个流就行了查了下才知道不行InputStream对象本身不能复制它也没有实现Cloneable接口。
那就先用byte[]去存储然后用的时候在转换。调整后的代码
public static byte[] readInputStreamToByteArray(InputStream inputStream) throws IOException {ByteArrayOutputStream byteArrayOutputStream new ByteArrayOutputStream();byte[] buffer new byte[1024];int bytesRead;while ((bytesRead inputStream.read(buffer)) ! -1) {byteArrayOutputStream.write(buffer, 0, bytesRead);}return byteArrayOutputStream.toByteArray();}Overridepublic FileInfo upload(String filename, Long size, InputStream inputStream) {try (InputStream in inputStream) {byte[] bytes readInputStreamToByteArray(in);//检验文件CheckFileUtil.checkFile(new ByteArrayInputStream(bytes), FileUtil.extName(filename));LoggerFactory.getLogger(this.getClass()).info(上传文件的文件名filename);//上传文件String filePathUrl saveToDisk(new ByteArrayInputStream(bytes), FileUtil.extName(filename)); 但是这种明显只适用于文件不大的时候不知道如果文件较大的情况下该怎么进一步优化先记录下后面遇到了再补充