首页 > 编程知识 正文

java multipartfile,multifile转成file

时间:2023-05-05 05:07:19 阅读:145510 作者:3285

由于工作需要,与文件类型的转换有关。 事实上,多文件有直接转换为InputStream的方法,但没有直接从InputStream转换为多文件的方法。

粗略浏览一下网上的资料,有两个简单的计划: CommonsMultipartFile和MockMultipartFile,但这两个都不适用。 因为无法添加依赖项。

我们决定先看看多文件是如何转换为InputStream的。

publicclasscommonsmultipartfileimplementsmultipartfile,serializable { protectedstaticfinalloggger=log factory.get log } 私人财务长尺寸; 私密性booleanpreservefilename=false; publiccommonsmultipartfile (fileitem fileitem ) { this.fileItem=fileItem; this.size=this.fileitem.getsize (; }我害羞地进入getInputStream ()方法,直接看到了CommonsMultipartFile实现类。 看来我的启动依赖直接包含了这个实现类。 即使不引进,接下来的事情也会顺利进行,但我决定今后也要看下去。

//CommonsMultipartFile的方法publicinputstreamgetinputstream () throwsioexception ) if (! this.is available ((thrownewillegalstateexception ) ) filehasbeenmoved-cannotbereadagain ); } else { inputstream inputstream=this.fileitem.get inputstream (; 返回输入流!=null? inputstream 3360 stream utils.empty input (; }你会发现压力来到了fileItem这边。 接下来继续查找,找到fileItem实现类

publicclassdiskfileitemimplementsfileitem { publicstaticfinalstringserializable _ property=diskfile item.class.getname } publicstaticfinalstringdefault _ charset=' iso-8859-1 '; privatestaticfinalstringuid=uuid.random uuid ().toString ).replace('-',' _ ' ); privatestaticfinalatomicintegercounter=newatomicinteger (0; 私有字符串字段名称; 私有金融字符串内容类型; 私密布尔is form field; 私有文件字符串文件名; private long size=-1L; 私有最终输入大小阈值; 私有文件存储库; 私有字节[ ] cached content; 隐私保护自由文件输出端口tputstreamdfos; 隐私转移文件模板; 私有文件df osfile; 私有文件头头头; publicdiskfileitem (字符串字段名称,字符串内容类型,布尔is form field,字符串文件名称,int sizeThreshold,filereposions this.isFormField=isFormField; this

fileName = fileName; this.sizeThreshold = sizeThreshold; this.repository = repository; }

虽然这个FileItem类有构造方法,不过。。里面有一些属性确实没看明白是干啥的。然后继续往后

public InputStream getInputStream() throws IOException { if (!this.isInMemory()) { return new FileInputStream(this.dfos.getFile()); } else { if (this.cachedContent == null) { this.cachedContent = this.dfos.getData(); } return new ByteArrayInputStream(this.cachedContent); } } public byte[] getData() { return this.memoryOutputStream != null ? this.memoryOutputStream.toByteArray() : null; } public synchronized byte[] toByteArray() { int remaining = this.count; if (remaining == 0) { return EMPTY_BYTE_ARRAY; } else { byte[] newbuf = new byte[remaining]; int pos = 0; Iterator var4 = this.buffers.iterator(); while(var4.hasNext()) { byte[] buf = (byte[])var4.next(); int c = Math.min(buf.length, remaining); System.arraycopy(buf, 0, newbuf, pos, c); pos += c; remaining -= c; if (remaining == 0) { break; } } return newbuf; }

最终看起来这个toByteArray()方法是个干活的,干的活大概是把文件转成byte[]数组,那实际上有两种解决方案了,一种就是直接用CommonsMultipartFile(这个地方我看了网上才知道有工厂类可以创建),一种是自己转化成byte[]数组,然后在转化成CommonsMultipartFile

public void testOSSServiceImport(){ File file = new File("test.png"); DiskFileItem fileItem = (DiskFileItem) new DiskFileItemFactory().createItem("file", MediaType.ALL_VALUE, true, file.getName()); try (InputStream input = new FileInputStream(file); OutputStream os = fileItem.getOutputStream()) { IOUtils.copy(input, os); } catch (Exception e) { throw new IllegalArgumentException("Invalid file: " + e, e); } MultipartFile multi = new CommonsMultipartFile(fileItem);}

这个是参考网上的CommonsMultipartFile用法

/** * 获取封装得MultipartFile * * @param inputStream inputStream * @param fileName fileName * @return MultipartFile */ public MultipartFile getMultipartFile(InputStream inputStream, String fileName) { FileItem fileItem = createFileItem(inputStream, fileName); //CommonsMultipartFile是feign对multipartFile的封装,但是要FileItem类对象 return new CommonsMultipartFile(fileItem); } /** * FileItem类对象创建 * * @param inputStream inputStream * @param fileName fileName * @return FileItem */ public FileItem createFileItem(InputStream inputStream, String fileName) { FileItemFactory factory = new DiskFileItemFactory(16, null); String textFieldName = "file"; FileItem item = factory.createItem(textFieldName, MediaType.MULTIPART_FORM_DATA_VALUE, true, fileName); int bytesRead = 0; byte[] buffer = new byte[10 * 1024 * 1024]; OutputStream os = null; //使用输出流输出输入流的字节 try { os = item.getOutputStream(); while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) { os.write(buffer, 0, bytesRead); } inputStream.close(); } catch (IOException e) { log.error("Stream copy exception", e); throw new IllegalArgumentException("文件上传失败"); } finally { if (os != null) { try { os.close(); } catch (IOException e) { log.error("Stream close exception", e); } } if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { log.error("Stream close exception", e); } } } return item; }

 

这个是用byte[]数组的转化

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。