步骤
- 增加相关依赖
<!-- 高性能分布式文件服务器 --> <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>1.26.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> </dependency>
- 在SpringBoot启动类的同目录下增加FastdfsImporter.java
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableMBeanExport; import org.springframework.context.annotation.Import; import org.springframework.jmx.support.RegistrationPolicy; import com.github.tobato.fastdfs.FdfsClientConfig; /** * 导入FastDFS-Client组件 * * @author tobato * */ @Configuration @Import(FdfsClientConfig.class) // 解决jmx重复注册bean的问题 @EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING) public class FastdfsImporter { // 导入依赖组件 }
- 在SpringBoot配置文件里增加相关配置(前提:先搭建好图片服务器)
############################################################ # # 分布式文件系统 fastdfs 配置 # ############################################################ fdfs.soTimeout=1501 fdfs.connectTimeout=601 fdfs.thumbImage.width=80 fdfs.thumbImage.height=80 fdfs.trackerList[0]=xx.xx.xx.xx:22122 #这里填分布式图片服务器ip:port fdfs.trackerList[1]=xx.xx.xx.xx:22123 #这里填分布式图片服务器ip:port
- 导入工具类
-
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(); } } }
-
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; } } 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; } }
-
- 测试启动
- 完毕