只支持在spring-boot 2.0以及以上版本中使用
1.pom.xml 里引入FASTDFS的依赖,toobato与fastdfs作者一起,将fastdfs的功能进行了重构与简化
<!-- 高性能分布式文件服务器 -->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.2</version>
</dependency>
2.引入spring-test的依赖,里面有将可以将文件对象转换为MutipartFile的方法
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
3.创建一个FastdfsImporter 类(随便起名),在类里面1定义如下配置,就可以将作者的fastDFS中的bean进行引入
@Configuration @Import(FdfsClientConfig.class)//@Import可以导入一个带有@configuration注解的类; // 解决jmx重复注册bean的问题 @EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING) public class FastdfsImporter { // 导入依赖组件 }
4.spring boot 配置文件中引入如下
fdfs.soTimeout=1501
fdfs.connectTimeout=601
#image size ,在方法中可以使用生成自定义的图片大小
fdfs.thumbImage.width=80
fdfs.thumbImage.height=80
# fastdfs address and port
fdfs.trackerList[0]=192.168.241.129:22122
5.接下来,提供给两个类,直接复制到自己的程序中,进行调用即可
----------------FastDFSClient----------------------直接用此类方法就可以将文件传入fastdfs图片服务器中
package com.project.util; import java.io.ByteArrayInputStream; import java.io.IOException; import java.nio.charset.Charset; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import com.github.tobato.fastdfs.domain.StorePath; import com.github.tobato.fastdfs.exception.FdfsUnsupportStorePathException; import com.github.tobato.fastdfs.service.FastFileStorageClient; @Component public class FastDFSClient { @Autowired private FastFileStorageClient storageClient; // @Autowired // private AppConfig appConfig; // 项目参数配置 /** * 上传文件 * * @param file * 文件对象 * @return 文件访问地址 * @throws IOException */ public String uploadFile(MultipartFile file) throws IOException { StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null); return storePath.getPath(); } public String uploadFile2(MultipartFile file) throws IOException { StorePath storePath = storageClient.uploadImageAndCrtThumbImage(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null); return storePath.getPath(); } public String uploadQRCode(MultipartFile file) throws IOException { StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), "png", null); return storePath.getPath(); } public String uploadFace(MultipartFile file) throws IOException { StorePath storePath = storageClient.uploadImageAndCrtThumbImage(file.getInputStream(), file.getSize(), "png", null); return storePath.getPath(); } public String uploadBase64(MultipartFile file) throws IOException { StorePath storePath = storageClient.uploadImageAndCrtThumbImage(file.getInputStream(), file.getSize(), "png", null); return storePath.getPath(); } /** * 将一段字符串生成一个文件上传 * * @param content * 文件内容 * @param fileExtension * @return */ public String uploadFile(String content, String fileExtension) { byte[] buff = content.getBytes(Charset.forName("UTF-8")); ByteArrayInputStream stream = new ByteArrayInputStream(buff); StorePath storePath = storageClient.uploadFile(stream, buff.length, fileExtension, null); return storePath.getPath(); } // 封装图片完整URL地址 // private String getResAccessUrl(StorePath storePath) { // String fileUrl = AppConstants.HTTP_PRODOCOL + appConfig.getResHost() + ":" + appConfig.getFdfsStoragePort() // + "/" + storePath.getFullPath(); // return fileUrl; // } /** * 删除文件 * * @param fileUrl * 文件访问地址 * @return */ public void deleteFile(String fileUrl) { if (StringUtils.isEmpty(fileUrl)) { return; } try { StorePath storePath = StorePath.praseFromUrl(fileUrl); storageClient.deleteFile(storePath.getGroup(), storePath.getPath()); } catch (FdfsUnsupportStorePathException e) { e.getMessage(); } } }
------------------ FileUtils----------提供了对文件操作,可以将file 对象转换为MutipartFile,base64字符串转换为文件(根据需要引入此类)
package com.project.util; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Service; import org.springframework.util.Base64Utils; import org.springframework.web.multipart.MultipartFile; @Service public class FileUtils { /** * 根据url拿取file * * @param url * @param suffix * 文件后缀名 */ public static File createFileByUrl(String url, String suffix) { byte[] byteFile = getImageFromNetByUrl(url); if (byteFile != null) { File file = getFileFromBytes(byteFile, suffix); return file; } else { return null; } } /** * 根据地址获得数据的字节流 * * @param strUrl * 网络连接地址 * @return */ private static byte[] getImageFromNetByUrl(String strUrl) { try { URL url = new URL(strUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5 * 1000); InputStream inStream = conn.getInputStream();// 通过输入流获取图片数据 byte[] btImg = readInputStream(inStream);// 得到图片的二进制数据 return btImg; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 从输入流中获取数据 * * @param inStream * 输入流 * @return * @throws Exception */ private static byte[] readInputStream(InputStream inStream) throws Exception { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, len); } inStream.close(); return outStream.toByteArray(); } // 创建临时文件 private static File getFileFromBytes(byte[] b, String suffix) { BufferedOutputStream stream = null; File file = null; try { file = File.createTempFile("pattern", "." + suffix); System.out.println("临时文件位置:" + file.getCanonicalPath()); FileOutputStream fstream = new FileOutputStream(file); stream = new BufferedOutputStream(fstream); stream.write(b); } catch (Exception e) { e.printStackTrace(); } finally { if (stream != null) { try { stream.close(); } catch (IOException e) { e.printStackTrace(); } } } return file; } public static MultipartFile createImg(String url) { try { // File转换成MutipartFile File file = FileUtils.createFileByUrl(url, "jpg"); FileInputStream inputStream = new FileInputStream(file); MultipartFile multipartFile = new MockMultipartFile(file.getName(), inputStream); return multipartFile; } catch (IOException e) { e.printStackTrace(); return null; } } /////////使用spring-test///////////////// public static MultipartFile fileToMultipart(String filePath) { try { // File转换成MutipartFile File file = new File(filePath); FileInputStream inputStream = new FileInputStream(file); MultipartFile multipartFile = new MockMultipartFile(file.getName(), "png", "image/png", inputStream); return multipartFile; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } public static void main(String[] args) { // WebFileUtils.createFileByUrl("http://122.152.205.72:88/group1/M00/00/01/CpoxxFr7oIaAZ0rOAAC0d3GKDio580.png", // "png"); // WebFileUtils.createImg("http://122.152.205.72:88/group1/M00/00/01/CpoxxFr7oIaAZ0rOAAC0d3GKDio580.png"); } public static boolean base64ToFile(String filePath, String base64Data) throws Exception { String dataPrix = ""; String data = ""; if(base64Data == null || "".equals(base64Data)){ return false; }else{ String [] d = base64Data.split("base64,"); if(d != null && d.length == 2){ dataPrix = d[0]; data = d[1]; }else{ return false; } } // 因为BASE64Decoder的jar问题,此处使用spring框架提供的工具包 byte[] bs = Base64Utils.decodeFromString(data); // 使用apache提供的工具类操作流 org.apache.commons.io.FileUtils.writeByteArrayToFile(new File(filePath), bs); return true; } }