从零开始搭建分布式电商网站(6)--使用FastDFS实现图片上传

论坛 期权论坛 脚本     
匿名技术用户   2021-1-2 16:22   57   0

一、实现目标

搭建FastDFS架构,编写代码实现图片上传

点击上传图片实现上传图片功能

二、安装FastDFS

1.安装

参考大神 https://www.jianshu.com/p/300faeb62a9e

2.测试

(1)确认tracker是否启动

[root@itcast-01 ~]# /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

(2)确认storage是否启动

[root@itcast-01 ~]# /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

(3)确认Nginx是否可用

[root@itcast-01 ~]# ps -ef | grep nginx

(4)上传图片

[root@itcast-01 ~]# /usr/bin/fdfs_test /etc/fdfs/client.conf upload aaa.png

三、图片上传测试

1.把FastDFS的java客户端依赖手动添加到Maven本地仓库,直接加入坐标使用

(1)复制maven文件到workpace

链接:https://pan.baidu.com/s/1-8ieZq5TAVMYyiArmveZrA
提取码:qfkm
复制这段内容后打开百度网盘手机App,操作更方便哦

(2)导入工程

(3)安装到本地仓库

2.编写测试工程测试

(1)编写一个maven项目(打jar包),pom文件导入依赖

(2)在resource目录下创建tracker.conf

内容为:

(3)编写测试类

import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.junit.Test;

public class FastDFSTest {

 @Test
 public void test() throws Exception {
  // 1. 加载FastDFS的tracker的配置信息,其实就是 tracker_server=192.168.37.161:22122
  ClientGlobal.init(System.getProperty("user.dir") + "/src/main/resources/tracker.conf");

  // 2. 创建TrackerClient,直接new
  TrackerClient trackerClient = new TrackerClient();

  // 3. 使用TrackerClient,获取TrackerServer
  TrackerServer trackerServer = trackerClient.getConnection();

  // 4. 声明StorageServer,为null就可以了
  StorageServer storageServer = null;

  // 5. 创建StorageClient,需要两个参数TrackerServer,StorageServer
  StorageClient storageClient = new StorageClient(trackerServer, storageServer);

  // 6. 使用StorageClient上传图片
  String[] result = storageClient.upload_file("C:/Users/Desktop/aaa.png", "png", null);

  // 7. 打印返回的结果,String数组
  for (String s : result) {
   System.out.println(s);
  }
 }


}

(4)查看控制台返回结果

成功!!!

四、图片上传功能实现

1.前端分析

可以看出文件上传的请求为/rest/pic/upload,需要编写对应controller

2.在web层的springmvc添加配置

 <!-- 配置图片文件上传解析器 -->
 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
 <property name="maxUploadSize" value="5000000"></property>
 </bean>

3.在taotao-common中创建PicUploadResult

public class PicUploadResult {

 private Integer error;// 0上传成功,1代表上传失败

 private String width;// 图片的宽
 private String height;// 图片的高
 private String url;// 图片的上传地址
get/set。。。。。。
}

别忘了install一下

4.在web的pom文件中添加两个依赖

5.创建图片上传配置文件

6.在web的springmvc中加载配置文件

7.编写controller

package com.taotao.manager.controller;

import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;

import org.apache.commons.lang3.StringUtils;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
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.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.taotao.common.PicUploadResult;

@Controller
@RequestMapping("pic/upload")
public class PicUploadController {

 @Value("${IMAGE_SERVER_URL}")
 private String IMAGE_SERVER_URL;

 private static String[] TYPE = { ".jpg", ".jpeg", ".png", ".bmp", ".gif" };

 /**
  * 图片上传
  * 
  * @param uploadFile
  * @return
  * @throws Exception
  */
 @RequestMapping(method = RequestMethod.POST)
 @ResponseBody
 public PicUploadResult upload(MultipartFile uploadFile) throws Exception {
  // 声明标志位
  boolean flag = false;

  // 初始化返回数据,初始化上传失败
  PicUploadResult picUploadResult = new PicUploadResult();
  picUploadResult.setError(1);

  // 校验后缀
  for (String type : TYPE) {
   String oname = uploadFile.getOriginalFilename();
   // 如果后缀是要求的格式结尾,标志位设置为true,跳出寻汗
   if (StringUtils.endsWithIgnoreCase(oname, type)) {
    flag = true;
    break;
   }
  }

  // 如果校验失败,直接返回
  if (!flag) {
   return picUploadResult;
  }

  // 重置标志位
  flag = false;

  // 图片内容校验
  try {
   BufferedImage image = ImageIO.read(uploadFile.getInputStream());
   if (image != null) {
    picUploadResult.setHeight(String.valueOf(image.getHeight()));
    picUploadResult.setWidth(String.valueOf(image.getWidth()));
    flag = true;
   }
  } catch (Exception e) {
  }

  // 校验成功,需要上传图片
  if (flag) {

   // 1. 加载tracker配置文件
   ClientGlobal.init(System.getProperty("user.dir") + "/src/main/resources/tracker.conf");

   // 2. 创建TrackerClient
   TrackerClient trackerClient = new TrackerClient();

   // 3. 获取TrackerServer
   TrackerServer trackerServer = trackerClient.getConnection();

   // 4. 声明StorageServer,为null
   StorageServer storageServer = null;

   // 5. 创建StorageClient
   StorageClient storageClient = new StorageClient(trackerServer, storageServer);

   // abcabbaddd 1.2.3.4.jpg
   // 6. 使用StorageClient上传图片
   // 获取上传文件的后缀名
   String ext = StringUtils.substringAfterLast(uploadFile.getOriginalFilename(), ".");
   String[] str = storageClient.upload_file(uploadFile.getBytes(), ext, null);

   // 7. 进行返回的结果的拼接,上传图片的url
   String picUrl = this.IMAGE_SERVER_URL + "/" + str[0] + "/" + str[1];

   // 设置图片url
   picUploadResult.setUrl(picUrl);

   // 上传成功设置为0
   picUploadResult.setError(0);
  }

  return picUploadResult;

 }
}

8.访问页面测试

成功!!!

解决火狐兼容性问题

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP