使用FastDFS上传文件

本文介绍如何在SpringMVC应用中实现文件上传功能,并详细讲解了使用MultipartFile类处理文件上传的步骤。此外,还深入探讨了如何将上传的文件存储到FastDFS系统中,包括配置FastDFS环境、上传文件并获取文件ID,以及将文件信息保存到MongoDB数据库的过程。

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

注意事项:

1.springMVC中上传文件使用的类是MultipartFile。
2.得到文件的扩展名:

//得到文件的原始名称
            String originalFilename = multipartFile.getOriginalFilename();
            //得到文件的扩展名
            String ext = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);

3.通过表单提交过来的数据,永远是JSON格式的数据.所以对于metadata虽然是Map类型的,但是我们依然需要用String进行接收,然后在转换成map格式。在设置到文件中,保存到数据库中。

 Map map = JSON.parseObject(metadata, Map.class);

1.步骤

1.初始化fastDFS环境
2.将文件上传到fastDFS中,得到一个文件id
3.将文件id及其它文件信息存储到mongodb中FileSystem数据库中的数据库中。
当前端调用上面集成的方法后,会获取到文件id,此时进行第4步操作。
4.想要使用具体的图片,还需要保存图片返回的文件id和具体的服务id保存到mysql数据库中。

2.1yml文件中FastDFS的配置:

xuecheng:
  fastdfs:
    connect_timeout_in_seconds: 5
    network_timeout_in_seconds: 30
    charset: UTF-8
    tracker_servers: 192.168.101.65:22122 #多个 trackerServer中间以逗号分隔

2.2初始化fastDFS环境

 @Value("${xuecheng.fastdfs.tracker_servers}")
    String tracker_servers;
    @Value("${xuecheng.fastdfs.connect_timeout_in_seconds}")
    int connect_timeout_in_seconds;
    @Value("${xuecheng.fastdfs.network_timeout_in_seconds}")
    int network_timeout_in_seconds;
    @Value("${xuecheng.fastdfs.charset}")
    String charset;
	//初始化fastDFS环境
    private void initFastDFSCofig(){
        try {
            ClientGlobal.initByTrackers(tracker_servers);
            ClientGlobal.setG_charset(charset);
            ClientGlobal.setG_connect_timeout(connect_timeout_in_seconds);
            ClientGlobal.setG_network_timeout(network_timeout_in_seconds);
        } catch (Exception e) {
            e.printStackTrace();
            ExceptionCast.cast(FileSystemCode.FS_INITFDFSERROR);
        }
    }

如果配置文件使用的是.properties,那么可以直接使用

 ClientGlobal.initByProperties("config/fastdfs-client.properties"); 

加载fastdfs-client.properties配置文件

2.2上传文件到fastDFS中

 /**
    * 上传文件到fastDFS
    * @param multipartFile
    * @return
    */
   private String fafs_upload(MultipartFile multipartFile){
       //初始化fastDFS的环境
       initFastDFSCofig();
       //创建trackerClient
       TrackerClient trackerClient = new TrackerClient();
       try {
           TrackerServer trackerServer = trackerClient.getConnection();
           //得到storage服务器
           StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);
           //创建storageClient来上传文件
           StorageClient1 storageClient1 = new StorageClient1(trackerServer, storeStorage);
           //上传文件,得到文件字节
           byte[] bytes = multipartFile.getBytes();
           //得到文件的原始名称
           String originalFilename = multipartFile.getOriginalFilename();
           //得到文件的扩展名
           String ext = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
           String fileId = storageClient1.upload_file1(bytes, ext, null);
           return fileId;
       }catch (Exception e){
           e.printStackTrace();
       }
       return null;
   }

2.3总步骤,到上传到MongDB数据库上进行文件的保存

 /**
    * 上传文件
    * @param multipartFile
    * @param filetag:文件标签
    * @param businesskey:业务key
    * @param metadata:元信息,json格式
    * @return
    */
   public UploadFileResult upload(MultipartFile multipartFile,
                                  String filetag,
                                  String businesskey,
                                  String metadata){

       if(multipartFile==null){
           ExceptionCast.cast(FileSystemCode.FS_UPLOADFILE_FILEISNULL);
       }
       //第一步:将文件上传到fastDFS中,得到一个文件id
       String fileId = fafs_upload(multipartFile);
       if(StringUtils.isEmpty(fileId)){
           ExceptionCast.cast(FileSystemCode.FS_UPLOADFILE_SERVERFAIL);
       }
       //第二步:将文件id及其它文件信息存储到mongodb中。
       FileSystem fileSystem = new FileSystem();
       fileSystem.setFileId(fileId);
       fileSystem.setFilePath(fileId);
       fileSystem.setFiletag(filetag);
       fileSystem.setBusinesskey(businesskey);
       fileSystem.setFileName(multipartFile.getOriginalFilename());
       fileSystem.setFileType(multipartFile.getContentType());
       if(StringUtils.isNotEmpty(metadata)){
           Map map = JSON.parseObject(metadata, Map.class);
           fileSystem.setMetadata(map);
       }
       fileSystemRepository.save(fileSystem);
       return new UploadFileResult(CommonCode.SUCCESS,fileSystem);
   }

2.4 写保存图片和服务关联的方法如:

  @ApiOperation("添加课程图片")
   public ResponseResult addCoursePic(String courseId,String pic);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值