1. 程式人生 > >maven工程中新增fastdfs(圖片伺服器)

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
		}
	}
}