SpringBoot整合FastDFS分布式图片服务器

步骤

  1. 增加相关依赖
    <!-- 高性能分布式文件服务器 -->
            <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>

     

  2. 在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 {
        // 导入依赖组件
    }

     

  3. 在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

     

  4. 导入工具类
    1. 
      
      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();
      		}
      	}
      }
      

       

    2. 
      
      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;
      	}
      }
      

       

  5. 测试启动
  6. 完毕
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值