Web项目中操作FastDFS的用法(详细版)

本文介绍如何在Web项目中使用FastDFS进行分布式文件的存储设计。

1. 使用MyBatis 进行数据库存储

// 定义文件信息实体类
public class FileInfo {
    private Integer id;
    private String fileName;
    private Long fileSize;
    private String fileId;
    private Date uploadTime;

    // 省略 getter 和 setter 方法
}

// 定义 MyBatis 的 Mapper 接口
public interface FileInfoMapper {
    void insertFileInfo(FileInfo fileInfo);
}

// 插入文件信息到数据库
FileInfo fileInfo = new FileInfo();
fileInfo.setFileName("test.jpg");
fileInfo.setFileSize(1024L);
fileInfo.setFileId("group1/M00/00/00/test.jpg");
fileInfo.setUploadTime(new Date());
fileInfoMapper.insertFileInfo(fileInfo);

2. FastDFS环境配置

  • FastDFS 客户端配置:在 Web 工程中引入 FastDFS Java 客户端依赖,并配置 fdfs_client.conf 文件,指定 Tracker Server 地址。
  • Web 服务器配置:配置 Tomcat 或其他 Web 服务器,确保能正常处理文件上传和下载请求。

fdfs_client.conf配置

connect_timeout = 2
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 8080
tracker_server = 192.168.1.100:22122

3. Web 页面展示

  • 数据库查询:从数据库中查询文件信息列表。
  • 数据展示:将查询到的文件信息在 Web 页面上展示,可使用 JSP、Thymeleaf 等模板引擎。
// Mapper 接口
public interface FileInfoMapper {
    List<FileInfo> getAllFileInfos();
}

// 查询文件列表
List<FileInfo> fileInfos = fileInfoMapper.getAllFileInfos();
// 在 JSP 页面展示
<%@ page import="java.util.List" %>
<%@ page import="com.example.entity.FileInfo" %>
<!DOCTYPE html>
<html>
<head>
    <title>文件列表</title>
</head>
<body>
    <table>
        <tr>
            <th>文件名</th>
            <th>文件大小</th>
            <th>上传时间</th>
        </tr>
        <% for (FileInfo fileInfo : fileInfos) { %>
        <tr>
            <td><%= fileInfo.getFileName() %></td>
            <td><%= fileInfo.getFileSize() %>KB</td>
            <td><%= fileInfo.getUploadTime() %></td>
        </tr>
        <% } %>
    </table>
</body>
</html>

4. 文件上传表单实现

  • 表单设计:使用 HTML 的 <form> 元素创建文件上传表单,设置 enctype="multipart/form-data"method="post"
  • 表单字段:包含文件选择框和提交按钮。
<!DOCTYPE html>
<html>
<head>
    <title>文件上传</title>
</head>
<body>
    <form action="upload.jsp" method="post" enctype="multipart/form-data">
        <input type="file" name="file">
        <input type="submit" value="上传">
    </form>
</body>
</html>

5.提交文件到 Tomcat 服务器

  • Servlet 处理:使用 Servlet 接收表单提交的文件数据。
  • 文件解析:使用 Apache Commons FileUpload 或 Servlet 3.0 自带的文件上传功能解析文件数据。
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Part filePart = request.getPart("file");
        String fileName = filePart.getSubmittedFileName();
        InputStream fileContent = filePart.getInputStream();
        // 后续处理文件上传到 FastDFS
    }
}

6. 文件上传到 FastDFS

  • FastDFS 客户端使用:初始化 FastDFS 客户端,调用上传方法将文件上传到 FastDFS。
  • 返回文件 ID:上传成功后,获取 FastDFS 返回的文件 ID。
import org.csource.common.MyException;
import org.csource.fastdfs.*;

import java.io.IOException;

public class FastDFSFileUploader {
    public static String uploadFile(byte[] fileBytes, String fileExtName) {
        try {
            ClientGlobal.init("fdfs_client.conf");
            TrackerClient trackerClient = new TrackerClient();
            TrackerServer trackerServer = trackerClient.getConnection();
            StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
            StorageClient1 storageClient = new StorageClient1(trackerServer, storageServer);
            String fileId = storageClient.upload_file1(fileBytes, fileExtName, null);
            trackerServer.close();
            return fileId;
        } catch (IOException | MyException e) {
            e.printStackTrace();
            return null;
        }
    }
}

7. 文件信息写数据库

  • 数据封装:将文件相关信息封装到 Java 对象中。
  • 数据库插入:使用持久化框架将文件信息插入到数据库表中。
FileInfo fileInfo = new FileInfo();
fileInfo.setFileName("test.jpg");
fileInfo.setFileSize(1024L);
fileInfo.setFileId("group1/M00/00/00/test.jpg");
fileInfo.setUploadTime(new Date());
fileInfoMapper.insertFileInfo(fileInfo);

8. 文件上传大小限制

  • Servlet 配置:在 web.xml 或使用注解配置 Servlet 时,设置文件上传大小限制。
  • 异常处理:当上传文件超过限制时,捕获异常并给客户端返回错误信息。
@WebServlet("/upload")
@MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2, // 2MB
        maxFileSize = 1024 * 1024 * 10, // 10MB
        maxRequestSize = 1024 * 1024 * 50) // 50MB
public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            Part filePart = request.getPart("file");
            // 处理文件上传
        } catch (IllegalStateException e) {
            response.getWriter().println("文件上传大小超过限制");
        }
    }
}



← 上一篇 AngularJS知识快速入门(上)
记得点赞、关注、收藏哦!
下一篇 Ajax——在OA系统提升性能的局部刷新 →
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值