fastDFS实现文件上传与下载

这篇具有很好参考价值的文章主要介绍了fastDFS实现文件上传与下载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

我们在做项目的时候经常会遇到文件的上传与下载。你们是怎么做的呢?现在有一个技术可以非常简单的实现这个功能——fastDFS

简介

FastDFS是一个分布式文件系统,使用FastDFS可以非常容易搭建一套高性能的文件服务器集群提供文件上传、下载服务。

原理

它主要包含两个部分, Tracker serverStorage server 客户端请求 Tracker server 进行文件上传、下载,通过 Tracker server 调度最终由 Storage server 完成文件上传和下载。

Tracker server主要是用来进行负载均衡和调度。其实它就是一个调度服务器,通过一些策略找到Storage server来提供文件上传服务。而Storage server的主要作用就是用来进行文件存储。我们上传上来的数据最终也是存储到Storage服务器上的。需要注意的一点就是它本身是没有实现自己的文件系统,而是利用操作系统上的文件系统来管理文件的。所以Storage被称为存储服务器。
fastDFS实现文件上传与下载,fastdfs
文件上传示意图:
fastDFS实现文件上传与下载,fastdfs
文件下载示意图:
fastDFS实现文件上传与下载,fastdfs

如何使用

  1. 导入依赖
<dependency>
    <groupId>com.github.tobato</groupId>
    <artifactId>fastdfs-client</artifactId>
    <version>1.26.7</version>
    <exclusions>
        <exclusion>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  1. 编写配置文件
server.port=8080
# ===================================================================
# 分布式文件系统FDFS配置
# ===================================================================
fdfs.so-timeout = 1501
fdfs.connect-timeout = 601
#缩略图生成参数
fdfs.thumb-image.width= 150
fdfs.thumb-image.height= 150
#TrackerList参数,支持多个
fdfs.tracker-list=10.199.12.106:22122
#访问路径
fdfs.web-server-url=http://10.199.12.106:8888/
  1. 代码
    创建一个工具类
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.domain.proto.storage.DownloadCallback;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
@Component
public class FastDFSClientUtil {
    @Autowired
    private FastFileStorageClient storageClient;
    /**
     * 上传
     * @param file 文件类
     * @return fileId 文件Id,包含group和uri的完整路径 EG=>>MO/22/22/**.jpg
     * @throws IOException
     */
    public String uploadFile(MultipartFile file) throws IOException {
        StorePath storePath = storageClient.uploadFile((InputStream) file.getInputStream(), file.getSize(),FilenameUtils.getExtension(file.getOriginalFilename()), null);
        return storePath.getFullPath();
    }
    /**
     * 删除
     * @param filePath 文件的fileId 包含分组,EG=>>group1/M00/22/22/***.**
     */
    public void delFile(String filePath) {
        storageClient.deleteFile(filePath);
    }
    /**
     * 下载
     * @param groupName 分组id  EG=>> group10
     * @param path 文件uri 分组之后的内容[不含开头的/] EG=>>MO/22/22/kkk.jpg
     * @return 文件的字节数组
     */
    public byte[] download(String groupName, String path) throws IOException {
        InputStream ins = storageClient.downloadFile(groupName, path, new DownloadCallback<InputStream>() {
            @Override
            public InputStream recv(InputStream ins) throws IOException {
                // 将此ins返回给上面的ins
                return ins;
            }
        });
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] buff = new byte[100];
        int rc = 0;
        while ((rc = ins.read(buff, 0, 100)) > 0) {
            byteArrayOutputStream.write(buff, 0, rc);
        }
        return byteArrayOutputStream.toByteArray();
    }
}

实现功能文章来源地址https://www.toymoban.com/news/detail-724733.html

import com.doria.fastdfs.utils.FastDFSClientUtil;
import com.github.tobato.fastdfs.exception.FdfsServerException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
@RestController
@RequestMapping("/file")
@Slf4j
public class FileController {
    //  引入客户端工具类
    @Autowired
    private FastDFSClientUtil fastDFSClientUtil;
    // 获取respon稍后向前端页面写入图片
    @Autowired
    private HttpServletResponse response;
    // 读取调度服务所在服务器稍后可以进行拼接,便于下次直接填写,这里由于nginx监听的是80端口,所以没有配置端口。默认访问80
    @Value("${fileServerUrl}")
    private String fileServerUrl;
    @PostMapping("/upload")
    public String uploadFile(MultipartFile file) {
        try {
            // 判断文件是否存在
            if (file == null) {
                throw new RuntimeException("文件不存在");
            }
            // 获取文件的完整名称
            String originalFilename = file.getOriginalFilename();
            if (StringUtils.isEmpty(originalFilename)) {
                throw new RuntimeException("文件不存在");
            }
            // 获取到返回的fileId
            String url = fastDFSClientUtil.uploadFile(file);
            // 拼接返回
            return fileServerUrl + url;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "文件上传失败";
    }
    // 删除文件[这里仅作测试用,实际中不会这样直接在controller删除
    // 是会根据业务从数据库中拿到url进行删除同时删除数据库关联数据,注意被占用无法删除]
    @DeleteMapping("/del")
    public String delFile(@RequestParam String fileId) {
        try {
            fastDFSClientUtil.delFile(fileId);
            return "删除成功";
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "删除失败";
    }
    /**
     * 文件下载,页面直接访问我们这个服务器,在页面眼里,直接从我们这个服务拿到了文件,而我们去fastdfs服务器获取文件
     * 前方的ip端口我们可以固定一个服务器,ip就是当前方法所在服务器的ip,前端找到我们。我们再去给他下载转发
     * 也可以将这个服务部署在fastdfs的本地,然后通过springcloud即时发现服务调用下载服务
     * @param groupName
     * @param path
     */
    @GetMapping("/download")
    public void download(@RequestParam String groupName, @RequestParam String path) {
        try {
            // 拆分获取出文件名称,方便一会写入的时候写出正确的文件名(url中的文件名和服务器中是一致的,至少默认是这样的)
            String[] split = path.split("/");
            String imgName=split[split.length-1];
            // 设置请求头为附件模式
            response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(imgName, "UTF-8"));
            // 调用客户端获取文件字节码
            byte[] imageByte = fastDFSClientUtil.download(groupName, path);
            // 从response获取响应流
            ServletOutputStream outputStream = response.getOutputStream();
            // 向流写入数据
            outputStream.write(imageByte);
            // 关流
            outputStream.close();
        }catch (FdfsServerException e){
            log.error("文件不存在");
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

到了这里,关于fastDFS实现文件上传与下载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FastDFS+Nginx - 本地搭建文件服务器同时实现在外远程访问「端口映射」

    FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。 FastDFS为互联网量身定制,充分考

    2024年02月11日
    浏览(46)
  • FastDFS+Nginx - 本地搭建文件服务器同时实现在外远程访问「端口映射」(1)

    大家好,我是晓星航。今天为大家带来的是 FastDFS+Nginx 的讲解!😀 转载自cpolar极点云的文章:FastDFS与Nginx结合搭建文件服务器,并内网穿透实现公网访问 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、

    2024年02月04日
    浏览(49)
  • FastDFS与Nginx结合搭建文件服务器,并实现公网访问【内网穿透】

    FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。 FastDFS为互联网量身定制,充分考

    2024年02月11日
    浏览(59)
  • FastDFS+Nginx - 本地搭建文件服务器同时实现在外远程访问「内网穿透」

    FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。 FastDFS为互联网量身定制,充分考

    2024年02月05日
    浏览(51)
  • FastDFS与Nginx结合搭建文件服务器,并内网穿透实现公网访问

    FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。 FastDFS为互联网量身定制,充分考

    2024年02月01日
    浏览(43)
  • 开源轻量级分布式文件系统FastDFS本地部署并实现远程访问服务器

    FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。 FastDFS为互联网量身定制,充分考

    2024年02月04日
    浏览(65)
  • FastDFS文件系统本地部署结合Nginx与内网穿透实现远程访问本地服务器

    FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。 FastDFS为互联网量身定制,充分考

    2024年02月05日
    浏览(58)
  • 如何在Linux部署FastDFS文件服务并实现无公网IP远程访问内网文件——“cpolar内网穿透”

    FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。 FastDFS为互联网量身定制,充分考

    2024年03月14日
    浏览(46)
  • 从零开始搭建高效的文件服务器:FastDFS与Nginx完美结合,内网穿透实现公网访问

    目录 前言 1. 本地搭建FastDFS文件系统 1.1 环境安装 1.2 安装libfastcommon 1.3 安装FastDFS 1.4 配置Tracker 1.5 配置Storage 1.6 测试上传下载 1.7 与Nginx整合 1.8 安装Nginx 1.9 配置Nginx 2. 局域网测试访问FastDFS 3. 安装cpolar内网穿透 4. 配置公网访问地址 5. 固定公网地址 5.1 保留二级子域名 5.2 配置

    2024年02月03日
    浏览(58)
  • FastDFS分布式文件存储

    为什么会有分布式文件系统? 分布式文件系统是面对互联网的需求而产生。因为互联网时代要对海量数据进行存储。很显然靠简单的增加硬盘个数已经满足不了我们的要求。 因为硬盘传输速度有限但是数据在急剧增长,另外我们还要要做好数据备份、数据安全等。 采用分布

    2024年01月23日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包