1. 程式人生 > 實用技巧 >【FastDFS】06 SpringBoot實現上傳

【FastDFS】06 SpringBoot實現上傳

建立SpringBoot工程:

再匯入所需要的依賴:

        <dependency>
            <groupId>net.oschina.zcx7878</groupId>
            <artifactId>fastdfs-client-java</artifactId>
            <version>1.27.0.0</version>
        </dependency>

        <dependency>
            <
groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency>

建立上傳業務層程式:

package cn.dzz.fastdfs.service;

import org.apache.commons.lang3.StringUtils;
import org.csource.fastdfs.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import java.util.HashMap; import java.util.Map; /** * @author DaiZhiZhou * @file Boot-With-FastDFS * @create 2020-08-13 8:55 */ // @PropertySource() @Component public class UploadService { @Value(
"${fastdfs.tracker_servers}") private String tracker_servers; @Value("${fastdfs.connect_timeout_in_seconds}") private int connect_timeout; @Value("${fastdfs.network_timeout_in_seconds}") private int network_timeout; @Value("${fastdfs.charset}") private String charset; public Map<String,Object> upload(MultipartFile multipartFile) { if (multipartFile == null) { throw new RuntimeException("檔案不能為空"); } // 上傳至fastDFS, 返回檔案id String fileId = this.fdfsUpload(multipartFile); if (StringUtils.isEmpty(fileId)) { System.out.println("上傳失敗"); throw new RuntimeException("上傳失敗"); } Map<String, Object> map=new HashMap<>(); map.put("code",200); map.put("msg","上傳成功"); map.put("fileId",fileId); return map; } /** * 上傳至fastDFS * @param multipartFile * @return 檔案id */ private String fdfsUpload(MultipartFile multipartFile) { // 1. 初始化fastDFS的環境 initFdfsConfig(); // 2. 獲取trackerClient服務 TrackerClient trackerClient = new TrackerClient(); try { TrackerServer trackerServer = trackerClient.getConnection(); // 3. 獲取storage服務 StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer); // 4. 獲取storageClient StorageClient1 storageClient1 = new StorageClient1(trackerServer, storeStorage); // 5. 上傳檔案 (檔案位元組, 副檔名, ) // 5.1 獲取副檔名 String originalFilename = multipartFile.getOriginalFilename(); String extName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1); // 5.2 上傳 String fileId = storageClient1.upload_file1(multipartFile.getBytes(), extName, null); return fileId; } catch (Exception e) { System.out.println(e); return null; } } /** * 初始化fastDFS的環境 */ private void initFdfsConfig() { try { ClientGlobal.initByTrackers(tracker_servers); ClientGlobal.setG_connect_timeout(connect_timeout); ClientGlobal.setG_network_timeout(network_timeout); ClientGlobal.setG_charset(charset); } catch (Exception e) { System.out.println(e); } } }

建立上傳控制器:

package cn.dzz.fastdfs.controller;

import cn.dzz.fastdfs.service.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import java.util.Map;

/**
 * @author DaiZhiZhou
 * @file Boot-With-FastDFS
 * @create 2020-08-13 8:58
 */

@RestController
@RequestMapping("upload")
public class UploadController {
    
    @Autowired
    private UploadService uploadService;
    
    /**
     * 作上傳
     */
    @RequestMapping("doUpload")
    public Map<String,Object> doUpload(MultipartFile mf){
        System.out.println(mf.getOriginalFilename());
        Map<String, Object> map = uploadService.upload(mf);
        return map;
    }
}

在static目錄中建立index.html用於上傳測試:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1>檔案上傳</h1>
<hr>
<form action="/upload/doUpload" method="post" enctype="multipart/form-data">
    <input type="file" name="mf">
    <input type="submit" value="上傳">
</form>

</body>
</html>

執行SpringBoot進行測試:

測試成功:

檢視檔案位置也可以被訪問到:


上傳檔案實現方式二:

更改依賴:

        <!-- https://mvnrepository.com/artifact/com.github.tobato/fastdfs-client -->
        <dependency>
            <groupId>com.github.tobato</groupId>
            <artifactId>fastdfs-client</artifactId>
            <version>1.26.7</version>
        </dependency>

建立一個配置類UploadProperties

package cn.dzz.fastdfs.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author DaiZhiZhou
 * @file Boot-With-FastDFS
 * @create 2020-08-13 9:10
 */

@Data
@Component
@ConfigurationProperties(prefix = "upload")
public class UploadProperties {
    private String baseUrl;
    private List<String> allowTypes;
}

更改之前的yml配置:

fdfs:
  so-timeout: 2500       # 讀取時間
  connect-timeout: 600   # 連線超時時間
  thumb-image:           # 縮圖
    width: 100
    height: 100
  tracker-list:          # tracker服務配置地址列表
    - 伺服器或者虛擬機器IP:22122
upload:
  base-url: http://伺服器或者虛擬機器IP/
  allow-types:
    - image/jpeg
    - image/png
    - image/bmp
    - image/gif

編寫UploadProperties.java

package cn.dzz.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.List;

/**
 * @author DaiZhiZhou
 * @file fdfs
 * @create 2020-08-13 9:33
 */
@ConfigurationProperties(prefix = "upload")
@Data
public class UploadProperties {
    private String baseUrl;
    private List<String> allowTypes;
}

業務層:

package cn.dzz.service;

import cn.dzz.config.UploadProperties;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;

/**
 * @author DaiZhiZhou
 * @file fdfs
 * @create 2020-08-13 9:34
 */

@Component
@EnableConfigurationProperties(UploadProperties.class)
public class UploadService {
    private Log log= LogFactory.getLog(UploadService.class);

    @Autowired
    private FastFileStorageClient storageClient;

    @Autowired
    private UploadProperties prop;

    public String uploadImage(MultipartFile file) {
        // 1、校驗檔案型別
        String contentType = file.getContentType();
        if (!prop.getAllowTypes().contains(contentType)) {
            throw new RuntimeException("檔案型別不支援");
        }
        // 2、校驗檔案內容
        try {
            BufferedImage image = ImageIO.read(file.getInputStream());
            if (image == null || image.getWidth() == 0 || image.getHeight() == 0) {
                throw new RuntimeException("上傳檔案有問題");
            }
        } catch (IOException e) {
            log.error("校驗檔案內容失敗....{}", e);
            throw new RuntimeException("校驗檔案內容失敗"+e.getMessage());
        }

        try {
            // 3、上傳到FastDFS
            // 3.1、獲取副檔名
            String extension = StringUtils.substringAfterLast(file.getOriginalFilename(), ".");
            // 3.2、上傳
            StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), extension, null);
            // 返回路徑
            return prop.getBaseUrl() + storePath.getFullPath();
        } catch (IOException e) {
            log.error("【檔案上傳】上傳檔案失敗!....{}", e);
            throw  new RuntimeException("【檔案上傳】上傳檔案失敗!"+e.getMessage());
        }
    }
}

控制器:

package cn.dzz.controller;

import cn.dzz.service.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.Map;

/**
 * @author DaiZhiZhou
 * @file fdfs
 * @create 2020-08-13 9:35
 */
@RequestMapping("upload")
@RestController
public class UploadController {

    @Autowired
    private UploadService uploadService;

    @RequestMapping("doUpload")
    public Map<String,Object> doUpload(MultipartFile multipartFile) {
        System.out.println(multipartFile.getOriginalFilename());
        Map<String, Object> map = new HashMap<>();
        String filePath = uploadService.uploadImage(multipartFile);
        map.put("filePath", filePath);
        return map;
    }

}

還是一樣的上傳頁面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1>檔案上傳</h1>
<hr>
<form action="/upload/doUpload" method="post" enctype="multipart/form-data">
    <input type="file" name="mf">
    <input type="submit" value="上傳">
</form>

</body>
</html>

執行發現空指標異常,檢查發現表單名稱沒對上,SpringMVC就無法轉換了

<input type="file" name="multipartFile">

再次測試:

訪問: