基于SpringBoot實現上傳2種方法工程代碼實例
創(chuàng)建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>
創(chuàng)建上傳業(yè)務層程序:
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的環(huán)境
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. 上傳文件 (文件字節(jié), 文件擴展名, )
// 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的環(huán)境
*/
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);
}
}
}
創(chuàng)建上傳控制器:
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目錄中創(chuàng)建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>
創(chuàng)建一個配置類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;
}
業(yè)務層:
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>
運行發(fā)現空指針異常,檢查發(fā)現表單名稱沒對上,SpringMVC就無法轉換了

<input type="file" name="multipartFile">
再次測試:

訪問:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Java之Spring認證使用Profile配置運行環(huán)境講解
這篇文章主要介紹了Java之Spring認證使用Profile配置運行環(huán)境講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-07-07
JDK8接口的默認與靜態(tài)方法-接口與抽象類的區(qū)別詳解
這篇文章主要介紹了JDK8接口的默認與靜態(tài)方法-接口與抽象類的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,,需要的朋友可以參考下2019-06-06

