正好,淘淘商城講這一塊的時候,我又想起來當時老徐讓我寫過一個關於實現FastDFS實現文件上傳下載的使用文檔,當時結合我們的ITOO的視頻系統和畢業論文系統,整理了一下,有根據網上查到的知識,總結了一點東西,下面分享一下
一、FastDFS簡介:
參見博客:http://blog.csdn.NET/liweizhong193516/article/details/53234486
二、FastDFS使用流程介紹:
我們在itoo的dobbu+zk框架中使用fastdfs+nginx+MySQL實現上傳附件的功能,主要原理就是將附件上傳到fastdfs得到一個文件的鏈接路徑url,我們獲取到這個url將他以字符串形式保存到我們的mysql中,下載的時候獲取到這個url直接打開或者下載附件。(url內容參見博客:http://blog.csdn.Net/liweizhong193516/article/details/52556526)
默認的,我們就知道fastdfs后面還有一個nginx服務器,當我們進行存儲文件的時候,我們要通過fastdfs給我們生成一個保存地址,也就是grounpID 和保存地址,然后將文件已key-value方式存進nginx服務器中;當我們進行讀取文件的時候,我們要通過獲取mysql里面的相應文件的存儲地址去nginx服務器中通過key,去取出我們的文件進行展示。(所以下載圖,有點問題,在這里解釋一下)
三、實現流程:
1、配置依賴:因為我們使用的maven來管理工程,所以,我們需要去陪pom文件
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.leech</groupId>
- <artifactId>fastdfs-demo</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>fastdfs-demo</name>
- <url>http://maven.apache.org</url>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.11</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.csource</groupId>
- <artifactId>fastdfs-client-java</artifactId>
- <version>1.25</version>
- </dependency>
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>2.4</version>
- </dependency>
- </dependencies>
- </project>
當然,更多時候我們利用maven的繼承特性,直接配置在父工程中,然后繼承下來就o了。
2、新建fdfs_client.conf文件,在我們的itoo中,我們建立在(src/main/resources底下)
- connect_timeout = 2
- network_timeout = 30
- charset = UTF-8
- http.tracker_http_port = 80
- #沒什么用
- http.anti_steal_token = no
- http.secret_key = FastDFS1234567890
- tracker_server = 192.168.17.112:22122
- #tracker_server = 192.168.0.119:22122
3、實現文件上傳:
- public void save(HttpServletRequest request,HttpServletResponse response){
- String videoName=request.getParameter("videoName");
- String videoType=request.getParameter("videoType");
- String videoDesc=request.getParameter("videoDesc");
- String videoPath=request.getParameter("videoPath");
- String picturePath=request.getParameter("picturePath");
- SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- Date uploadTime=null;
- try {
- uploadTime = formatter.parse(formatter.format(new Date()));
- } catch (ParseException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- JacksonJsonUntil jackJsonUtil =new JacksonJsonUntil ();
- String dataBaseName = "itoo_video";
- Video video=new Video();
- video.setUserName("why");
- video.setUserID("why");
- video.setVideoName(videoName);
- video.setVideoPath(videoPath);
- video.setVideoType(videoType);
- video.setVideoDesc(videoDesc);
- video.setDataBaseName(dataBaseName);
- video.setPicturePath(picturePath);
- video.setUploadTime(uploadTime);
- uploadFileService.save(video);
- jackJsonUtil.beanToJson(response,video);
- }
- /*
- * 上傳文件
- */
- @RequestMapping(value={"/upload"})
- @ResponseBody
- public void upload( MultipartFile file, HttpServletRequest request,HttpServletResponse response){
- String ext_Name = file.getOriginalFilename().split("\\.")[1];
- String videoName=file.getOriginalFilename().split("\\.")[0];
- byte[] bytes = null;
- try {
- bytes = file.getBytes();
- } catch (IOException e) {
- e.printStackTrace();
- }
- String videoPath=uploadFile(bytes,ext_Name);
- JacksonJsonUntil jackJsonUtil =new JacksonJsonUntil ();
- Video video=new Video();
- video.setVideoPath(videoPath);
- video.setVideoName(videoName);
- jackJsonUtil.beanToJson(response,video);
- }
- public String uploadFile(byte[] byteFile, String ext_file) {
- // 拼接服務區的文件路徑
- StringBuffer sbPath = new StringBuffer();
- sbPath.append("http://192.168.22.252");
- try {
- // 初始化文件資源
- ClientGlobal
- .init("C:\\Users\\alsr\\Desktop\\ITOO-5.0\\itoo-video-Test\\dmsd-itoo-video-parent\\dmsd-itoo-video-web\\src\\main\\resources\\fdfs_client.conf");
- // 鏈接FastDFS服務器,創建tracker和Stroage
- TrackerClient trackerClient = new TrackerClient();
- TrackerServer trackerServer = trackerClient.getConnection();
- StorageServer storageServer = null;
- StorageClient storageClient = new StorageClient(trackerServer,
- storageServer);
- //利用字節流上傳文件
- String[] strings = storageClient.upload_file(byteFile, ext_file, null);
- for (String string : strings) {
- sbPath.append("/" + string);
- System.out.println(string);
- }
- // 全路徑
- System.out.println(sbPath);
- } catch (IOException | MyException e) {
- e.printStackTrace();
- }
- return sbPath.toString();
- }
只要我們能正常接收到一個json類型的字符串(url地址),就證明我們已經上傳成功了,如果不信,可以直接用瀏覽器去驗證一下,看看能不能得到文件展示。
4、FastDFS實現文件下載:
- public void testDownload() {
- try {
- ClientGlobal.init(conf_filename);
- TrackerClient tracker = new TrackerClient();
- TrackerServer trackerServer = tracker.getConnection();
- StorageServer storageServer = null;
- StorageClient storageClient = new StorageClient(trackerServer, storageServer);
- byte[] b = storageClient.download_file("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");
- System.out.println(b);
- IOUtils.write(b, new FileOutputStream("D:/"+UUID.randomUUID().toString()+".conf"));
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
5、FastDFS獲取將上傳文件信息:
- public void testGetFileInfo(){
- try {
- ClientGlobal.init(conf_filename);
- TrackerClient tracker = new TrackerClient();
- TrackerServer trackerServer = tracker.getConnection();
- StorageServer storageServer = null;
- StorageClient storageClient = new StorageClient(trackerServer, storageServer);
- FileInfo fi = storageClient.get_file_info("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");
- System.out.println(fi.getSourceIpAddr()); System.out.println(fi.getFileSize());
- System.out.println(fi.getCreateTimestamp()); System.out.println(fi.getCrc32());
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
6、FastDFS獲取文件名稱:
- public void testGetFileMate(){
- try {
- ClientGlobal.init(conf_filename);
- TrackerClient tracker = new TrackerClient();
- TrackerServer trackerServer = tracker.getConnection();
- StorageServer storageServer = null;
- StorageClient storageClient = new StorageClient(trackerServer,
- storageServer);
- NameValuePair nvps [] = storageClient.get_metadata("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");
- for(NameValuePair nvp : nvps){
- System.out.println(nvp.getName() + ":" + nvp.getValue());
- }
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
7、FastDFS實現刪除文件:
- public void testDelete(){
- try {
- ClientGlobal.init(conf_filename);
- TrackerClient tracker = new TrackerClient();
- TrackerServer trackerServer = tracker.getConnection();
- StorageServer storageServer = null;
- StorageClient storageClient = new StorageClient(trackerServer,storageServer);
- int i = storageClient.delete_file("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");
- System.out.println( i==0 ? "刪除成功" : "刪除失敗:"+i);
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }