maven工程中新增fastdfs(圖片伺服器)
百度網盤:
連結:https://pan.baidu.com/s/1ASbiB4pPl5Ez-v8zfhAPhw
提取碼:8zwt
一。
將此工程(fastdfs_client)匯入到eclipse中,然後update一下,之後install此專案,就可以將此專案打包成jar包,新增到中央倉庫,另外需要在web工程中新增相關依賴,即可
二。
建立配置檔案client.conf 在src/main/resources下建立一個recource(Folder),在其中建立配置檔案client.conf
上傳測試類
public class TestPicture { @Test public void testUpload() throws FileNotFoundException, IOException, MyException{ //1.初始化,讀取配置檔案,上傳的伺服器 ClientGlobal.init("C:/1701A/taoTaoworkspace/taotao-manager-web/src/main/resources/resource/client.conf"); //2.建立tarkerclient物件 TrackerClient trackerClient = new TrackerClient(); //3.建立trackerServer物件 ,獲取連線 TrackerServer trackerServer = trackerClient.getConnection(); //4.建立StorageServer StorageServer storageServer = null; //5.建立一個StorageClient物件,需要兩個引數TrackerServer物件、StorageServer的引用 StorageClient storageClient = new StorageClient(trackerServer, storageServer); //6.上傳檔案 檔案地址, 檔案型別 null String[] str = storageClient.upload_file("D:/image/20.jpg", "jpg", null); for (String string : str) { System.out.println(string); } } }
執行測試類後在後臺顯示圖片的地址,在瀏覽器上輸入即可
三。
運用工具類FastDFSClient 在web工程中新增一個包utils。將工具類放入裡面,因為這個工具類只是在web工程中使用,就不放入到common工程中
package com.taotao.utils; import org.csource.common.NameValuePair; import org.csource.fastdfs.ClientGlobal; import org.csource.fastdfs.StorageClient1; import org.csource.fastdfs.StorageServer; import org.csource.fastdfs.TrackerClient; import org.csource.fastdfs.TrackerServer; public class FastDFSClient { private TrackerClient trackerClient = null; private TrackerServer trackerServer = null; private StorageServer storageServer = null; private StorageClient1 storageClient = null; public FastDFSClient(String conf) throws Exception { if (conf.contains("classpath:")) { conf = conf.replace("classpath:", this.getClass().getResource("/").getPath()); } ClientGlobal.init(conf); trackerClient = new TrackerClient(); trackerServer = trackerClient.getConnection(); storageServer = null; storageClient = new StorageClient1(trackerServer, storageServer); } /** * 上傳檔案方法 * <p>Title: uploadFile</p> * <p>Description: </p> * @param fileName 檔案全路徑 * @param extName 副檔名,不包含(.) * @param metas 檔案擴充套件資訊 * @return * @throws Exception */ public String uploadFile(String fileName, String extName, NameValuePair[] metas) throws Exception { String result = storageClient.upload_file1(fileName, extName, metas); return result; } public String uploadFile(String fileName) throws Exception { return uploadFile(fileName, null, null); } public String uploadFile(String fileName, String extName) throws Exception { return uploadFile(fileName, extName, null); } /** * 上傳檔案方法 * <p>Title: uploadFile</p> * <p>Description: </p> * @param fileContent 檔案的內容,位元組陣列 * @param extName 副檔名 * @param metas 檔案擴充套件資訊 * @return * @throws Exception */ public String uploadFile(byte[] fileContent, String extName, NameValuePair[] metas) throws Exception { String result = storageClient.upload_file1(fileContent, extName, metas); return result; } public String uploadFile(byte[] fileContent) throws Exception { return uploadFile(fileContent, null, null); } public String uploadFile(byte[] fileContent, String extName) throws Exception { return uploadFile(fileContent, extName, null); } }
編寫測試類
@Test
public void testUploadUtils() throws Exception{
FastDFSClient fastDFSClient = new FastDFSClient("C:/1701A/taoTaoworkspace/taotao-manager-web/src/main/resources/resource/client.conf");
String str = fastDFSClient.uploadFile("D:/image/vv.jpg");
System.out.println(str);
}
測試結果
四。
圖片上傳功能使用到富文字編輯器:KindEdit
返回格式:
//成功時
{
"error" : 0,
"url" : "http://www.example.com/path/to/file.ext"
}
//失敗時
{
"error" : 1,
"message" : "錯誤資訊"
}
業務邏輯:
1、接收頁面傳遞的圖片資訊uploadFile
2、把圖片上傳到圖片伺服器。使用封裝的工具類實現。需要取檔案的內容和副檔名。
3、圖片伺服器返回圖片的url
4、將圖片的url補充完整,返回一個完整的url。
5、把返回結果封裝到一個Map物件中返回。
五。
建立一個基礎的ip,resource.properties 根據伺服器不同可以修改
然後在springmvc.xml中新增:
<!-- 載入配置檔案 -->
<context:property-placeholder location="classpath:resource/resource.properties" />
六。
JsonUtils工具類:將map轉換為json
package com.taotao.utils;
import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.taotao.result.TaotaoResult;
/**
* 淘淘商城自定義響應結構
*/
public class JsonUtils {
// 定義jackson物件
private static final ObjectMapper MAPPER = new ObjectMapper();
/**
* 將物件轉換成json字串。
* <p>Title: pojoToJson</p>
* <p>Description: </p>
* @param data
* @return
*/
public static String objectToJson(Object data) {
try {
String string = MAPPER.writeValueAsString(data);
return string;
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
/**
* 將json結果集轉化為物件
*
* @param jsonData json資料
* @param clazz 物件中的object型別
* @return
*/
public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {
try {
T t = MAPPER.readValue(jsonData, beanType);
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 將json資料轉換成pojo物件list
* <p>Title: jsonToList</p>
* <p>Description: </p>
* @param jsonData
* @param beanType
* @return
*/
public static <T>List<T> jsonToList(String jsonData, Class<T> beanType) {
JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
try {
List<T> list = MAPPER.readValue(jsonData, javaType);
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
七。
在pom.xml新增上傳所需的依賴
<!-- 檔案上傳元件 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
</dependency>
在springmvc.xml中新增圖片上傳的約束:圖片的大小
<!-- 定義檔案上傳解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 設定預設編碼 -->
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 設定檔案上傳的最大值5MB,5*1024*1024 -->
<property name="maxUploadSize" value="5242880"></property>
</bean>
Controller:
package com.taotao.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.taotao.utils.FastDFSClient;
import com.taotao.utils.JsonUtils;
@Controller
public class PictureController {
@Value("${IMAGE_BASE_URL}")
private String IMAGE_BASE_URL;
@RequestMapping("/pic/upload")
@ResponseBody
public String uploadFile(MultipartFile uploadFile){
//獲取到檔案路徑
String originalFilename = uploadFile.getOriginalFilename();
String extName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
try {
//讀取配置檔案
FastDFSClient fastDFSClient = new FastDFSClient("classpath:resource/client.conf");
//上傳後返回的路徑
String path = fastDFSClient.uploadFile(uploadFile.getBytes(), extName);
//前臺頁面展示 192.168
String pathUrl = IMAGE_BASE_URL+path;//返回的url
Map map = new HashMap<>();
map.put("error", 0);
map.put("url", pathUrl);
return JsonUtils.objectToJson(map);//轉為json
} catch (Exception e) {
e.printStackTrace();
Map map = new HashMap<>();
map.put("error", 1);
map.put("message", "圖片上傳失敗");
return JsonUtils.objectToJson(map);//轉為json
}
}
}