文件上传+Fastdfs+AjaxResult工具类

本文详细介绍了FastDFS在Linux环境下的安装配置流程,包括修改配置文件、启动服务、监控及测试。同时,深入探讨了FastDFS与Java微服务的集成,涵盖了依赖导入、配置、工具类使用及控制器接口设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Fastdfs

概念:

  • FastDFS是一套高性能的文件服务器集群,他提供了文件上传、下载等服务。(用他对文件进行统一的处理,一般在微服务中我们把它用来对图片进行统一的处理,他就是一个单独的微服务)

1.1 linux操做系统安装(配置)fastdfs

一般使用 fastdfs都是在linux上进行操做的(相当于在linux上安装fastdfs,然后再把图片上传到fastdfs)

  • 配置Fastdfs(在linux上进行cmd终端,执行以下命令)

1.修改client.conf

vi /etc/fdfs/client.conf -> 把ip修改为当前虚拟机ip

2.修改storage.conf

vi /etc/fdfs/storage.conf -> 把ip修改为当前虚拟机ip

3.启动fastdfs

#注意这里两个都要启动

service fdfs_trackerd start
service fdfs_storaged start

4.查看是否启动成功

netstat -unltp|grep fdfs

5.查看监控信息

/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

6.启动Nginx

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

7.关闭防火墙/开放防火墙 80 端口

service iptables stop

或者执行:

/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT

/etc/rc.d/init.d/iptables save

注意:网络使用的是桥接模式

8.测试Nginx

在虚拟机里面: curl http://127.0.0.1:80

在宿主机测试:浏览器访问 http://127.0.0.1:80

9.测试上传(上传到fastdfs)

fdfs_test /etc/fdfs/client.conf upload /root/虚拟机里面的图片.jpg

1.2 java代码Hello的简单测试

1、打jar包

  • 手动到网上去下载源码然后将源码打jar包到maven仓库

源码地址:https://github.com/happyfish100/fastdfs-client-java

  • 将这个源码下载完后进入根目录里面然后cmd执行下面的命令,就能自动进行打包

使用maven从源码安装:mvn clean install

2、导包

<dependency>
    <groupId>org.csource</groupId>
    <artifactId>fastdfs-client-java</artifactId>
    <version>1.29-SNAPSHOT</version>
</dependency>

3、添加配置文件fdfs_client.conf ,将其中的服务器地址设置为虚拟机ip.22122(后面的不是端口)
//…
tracker_server=192.168.25.133:22122
//…

 // 1、加载配置文件,配置文件中的内容就是 tracker 服务的地址。
		ClientGlobal.init("D:/maven_work/fastDFS-demo/src/fdfs_client.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[] strings = storageClient.upload_file("D:/pic/benchi.jpg", "jpg",
				null);
		// 7、返回数组。包含组名和图片的路径。
		for (String string : strings) {
			System.out.println(string);
		}

控制台输出如下结果:

group1
M00/00/00/wKgZhVkMP4KAZEy-AAA-tCf93Fo973.jpg

在浏览器输入:

http://192.168.25.133/group1/M00/00/00/wKgZhVkMP4KAZEy-AAA-tCf93Fo973.jpg

2、Fastdfs集成微服务

2.1 导入依赖

<dependencies>
    <!--    注册中心客户端包-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!--  集成Web的jar包,客户端必须要加-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!--zuul-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>

    <!--引入swagger支持-->
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger2</artifactId>
    </dependency>
    <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger-ui</artifactId>
    </dependency>

    <!--fastdfs-->
    <dependency>
      <groupId>org.csource</groupId>
      <artifactId>fastdfs-client-java</artifactId>
      <version>1.29-SNAPSHOT</version>
    </dependency>

    <!--截取后缀名的工具类jar包-->
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
    </dependency>


  </dependencies>

2.2 主配置类开启fastdfs服务

@SpringBootApplication
@EnableEurekaClient
public class FastdfsApp_2040 {

    public static void main( String[] args ){
        SpringApplication.run(FastdfsApp_2040.class);
    }
}

2.3 配置文件(application.yml)

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1010/eureka/ #注册中心服务端的注册地址
  instance:
    prefer-ip-address: true #使用ip进行注册
    instance-id: fastdfs-server:2040  #服务注册到注册中心的id
server:
  port: 2040

#应用的名字
spring:
  application:
    name: fastdfs-server

2.4 fastdfs的配置

fdfs_client.conf(配置文件名就叫这个)

tracker_server=虚拟机ip:22122

2.5 拷贝FastDfsApiOpr工具类

直接拷贝使用即可(里面包含了上传、下载、删除等操做,可以直接使用这个工具类来调用)

import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;

public class FastDfsApiOpr {
     
    public static String CONF_FILENAME  = FastDfsApiOpr.class.getClassLoader()
            .getResource("fast_client.conf").getFile();


    /**
     * 上传文件
     * @param file
     * @param extName
     * @return
     */
    public static  String upload(byte[] file,String extName) {

        try {
            ClientGlobal.init(CONF_FILENAME);

            TrackerClient tracker = new TrackerClient();
            TrackerServer trackerServer = tracker.getTrackerServer();
            StorageServer storageServer = null;

            StorageClient storageClient = new StorageClient(trackerServer, storageServer);
            //扩展(可以不要)
            /*NameValuePair nvp [] = new NameValuePair[]{
                    new NameValuePair("age", "18"),
                    new NameValuePair("sex", "male")
            };*/
            String fileIds[] = storageClient.upload_file(file,extName,null);

            System.out.println(fileIds.length);
            System.out.println("组名:" + fileIds[0]);
            System.out.println("路径: " + fileIds[1]);
            return  "/"+fileIds[0]+"/"+fileIds[1];

        } catch (Exception e) {
            e.printStackTrace();
            return  null;
        }
    }
    /**
     * 上传文件
     * @param extName
     * @return
     */
    public static  String upload(String path,String extName) {
 
        try { 
            ClientGlobal.init(CONF_FILENAME);
 
            TrackerClient tracker = new TrackerClient(); 
            TrackerServer trackerServer = tracker.getTrackerServer();
            StorageServer storageServer = null;
            StorageClient storageClient = new StorageClient(trackerServer, storageServer);
            String fileIds[] = storageClient.upload_file(path, extName,null);
             
            System.out.println(fileIds.length); 
            System.out.println("组名:" + fileIds[0]); 
            System.out.println("路径: " + fileIds[1]);
            return  "/"+fileIds[0]+"/"+fileIds[1];
 
        } catch (Exception e) {
            e.printStackTrace();
            return  null;
        }
    }

    /**
     * 下载文件
     * @param groupName
     * @param fileName
     * @return
     */
    public static byte[] download(String groupName,String fileName) {
        try {
 
            ClientGlobal.init(CONF_FILENAME);
 
            TrackerClient tracker = new TrackerClient(); 
            TrackerServer trackerServer = tracker.getTrackerServer();
            StorageServer storageServer = null;
 
            StorageClient storageClient = new StorageClient(trackerServer, storageServer); 
            byte[] b = storageClient.download_file(groupName, fileName);
            return  b;
        } catch (Exception e) {
            e.printStackTrace();
            return  null;
        } 
    }
     
//    @Test
//    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();
//        }
//    }
     
//    @Test
//    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();
//        }
//    }

    /**
     * 删除文件
     * @param groupName
     * @param fileName
     * 需要格式:
     * 		groupName:"group1", 
     * 		fileName:"M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf"
     */
    public static void delete(String groupName,String fileName){
        try { 
            ClientGlobal.init(CONF_FILENAME);
 
            TrackerClient tracker = new TrackerClient(); 
            TrackerServer trackerServer = tracker.getTrackerServer();
            StorageServer storageServer = null;
 
            StorageClient storageClient = new StorageClient(trackerServer, 
                    storageServer); 
            int i = storageClient.delete_file(groupName,fileName);
            System.out.println( i==0 ? "删除成功" : "删除失败:"+i);
        } catch (Exception e) {
            e.printStackTrace();
            throw  new RuntimeException("删除异常,"+e.getMessage());
        } 
    }
}

2.6 创建controller接口

上传接口

@RestController
@RequestMapping("/fastdfs")
public class FastdfsController {


    @PostMapping("/upload")
    public AjaxResult upload(MultipartFile file){

        //截取原生文件名的后缀(上传时文件的名的后缀)
        String extension = FilenameUtils.getExtension(file.getOriginalFilename());

        try {
            //上传(需要byte数组和后缀名,达到上传到fastdfs的效果):最终得到的就是上传后他返回的组名+文件名
            String upload = FastDfsApiOpr.upload(file.getBytes(), extension);
            return AjaxResult.me().setResultObj(upload);//将组名+文件名返回给前台,在通过前台提交把地址保存到数据库
        } catch (IOException e) {
            e.printStackTrace();
            return  AjaxResult.me().setSuccess(false).setMessage("上传失败");
        }
    }
}    

3、AjaxResult工具类

//Ajax请求响应对象的类
public class AjaxResult {
    private boolean success = true;
    private String message = "操作成功!";


    //返回到前台对象
    private Object resultObj;

    public boolean isSuccess() {
        return success;
    }

    public AjaxResult setSuccess(boolean success) {
        this.success = success;
        return this;
    }

    public String getMessage() {
        return message;
    }

    public AjaxResult setMessage(String message) {
        this.message = message;
        return this;
    }

    public Object getResultObj() {
        return resultObj;
    }

    public AjaxResult setResultObj(Object resultObj) {
        this.resultObj = resultObj;
        return this;
    }

    //AjaxResult.me()成功
    //AjaxResult.me().setMessage()成功
    //AjaxResult.me().setSuccess(false),setMessage("失败");
    public  static AjaxResult me(){
        return new AjaxResult();
    }



    /*
    //成功
    public AjaxResult() {
    }

    //失败并且有提示
    public AjaxResult(String message) {
        this.success = false;
        this.message = message;
    }*/
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值