zoukankan      html  css  js  c++  java
  • spring boot 2.0 与FASTDFS进行整合

    只支持在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;
    }
    }
    
     

      

    原创打造,多多指教
  • 相关阅读:
    re | [SWPU2019]ReverseMe
    wp | re | 2020“巅峰极客”网络安全技能挑战赛
    re | [CFI-CTF 2018]IntroToPE
    re | [FlareOn1]Bob Doge
    re | [ACTF新生赛2020]SoulLike
    re | [GKCTF2020]Chelly's identity
    ospf配置与ofps选举DR/BDR
    静态路由的配置
    配置三层交换机实现vlan间通信
    hybrid接口
  • 原文地址:https://www.cnblogs.com/iscys/p/9500892.html
Copyright © 2011-2022 走看看