草庐IT

第2-3-5章 删除附件的接口开发-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss

假装文艺范儿 2023-04-18 原文

目录

5.4 接口开发-根据id删除附件

第2-1-2章 传统方式安装FastDFS-附FastDFS常用命令
第2-1-3章 docker-compose安装FastDFS,实现文件存储服务
第2-1-5章 docker安装MinIO实现文件存储服务-springboot整合minio-minio全网最全的资料

全套代码及资料全部完整提供,点此处下载

5.4.1 接口文档

根据id删除附件接口要完成的操作主要有两个:

  • 将客户端上传的文件从指定存储位置(具体存储位置由配置文件配置的存储策略确定)删除
  • 将文件信息从数据库的pd_attachment表中删除

根据id删除附件功能的接口文档如下:

5.4.2 代码实现

第一步:在AttachmentController中提供文件删除的方法

@ApiOperation(value = "删除文件", notes = "删除文件")
@ApiImplicitParams({
    @ApiImplicitParam(name = "ids[]", value = "文件ids", dataType = "array", paramType = "query"),
})
@DeleteMapping
public R<Boolean> remove(@RequestParam(value = "ids[]") Long[] ids) {
    attachmentService.remove(ids);
    return success(true);
}

第二步:在AttachmentService接口中扩展remove方法

/**
* 删除附件
*
* @param ids
*/
void remove(Long[] ids);

第三步:在AttachmentServiceImpl实现类中实现remove方法

/**
*根据id删除附件
* @param ids
*/
@Override
public void remove(Long[] ids) {
    if (ArrayUtils.isEmpty(ids)) {
        return;
    }
    //查询数据库
    List<Attachment> list = super.list(Wrappers.<Attachment>lambdaQuery().
                                       in(Attachment::getId, ids));
    if (list.isEmpty()) {
        return;
    }
    //删除数据库中的记录
    super.removeByIds(Arrays.asList(ids));

    //对象格式处理
    List<FileDeleteDO> fileDeleteDOList =
        list.stream().map((fi) -> FileDeleteDO.builder()
                          .relativePath(fi.getRelativePath()) //文件在服务器的相对路径
                          .fileName(fi.getFilename()) //唯一文件名
                          .group(fi.getGroup()) //fastDFS返回的组 用于FastDFS
                          .path(fi.getPath()) //fastdfs 的路径
                          .build())
        .collect(Collectors.toList());
    //删除文件
    fileStrategy.delete(fileDeleteDOList);
}

5.4.3 接口测试

第一步:启动Nacos配置中心

第二步:启动Nginx服务

第三步:启动文件服务

第四步:访问接口文档,地址为http://localhost:8765/doc.html

可以看到pd_attachment表中对应的记录已经删除掉了,对应的文件也已经被删除掉了。

5.4.4 测试ALI和FAST_DFS以及MINIO上传和删除的接口

注:可以修改Nacos中的pd-file-server.yml配置文件,将存储策略改为ALI和FAST_DFS以及MINIO来测试文件的存储策略是否发生了变化。

5.4.4.1 阿里云OSS上传和删除
  • 上传

  • 删除

  • 删除后就资源就无法访问了

5.4.4.2 FastDFS上传和删除
  • 上传

  • 查看资源

  • 删除操作后再查看

5.4.4.3 Minio上传和删除
  • 上传

  • 查看minio中资源存储情况

  • 查看图片

  • 删除图片

  • 删除成功,资源已经不存在

5.5 接口开发-根据业务类型/业务id删除附件

5.5.1 接口文档

根据业务类型/业务id删除附件接口要完成的操作主要有两个:

  • 将客户端上传的文件从指定存储位置(具体存储位置由配置文件配置的存储策略确定)删除
  • 将文件信息从数据库的pd_attachment表中删除

根据业务类型/业务id删除附件功能的接口文档如下:

5.5.2 代码实现

第一步:在AttachmentController中提供根据业务类型/业务id删除文件的方法

@ApiOperation(value = "根据业务类型或业务id删除文件", 
              notes = "根据业务类型或业务id删除文件")
@DeleteMapping(value = "/biz")
public R<Boolean> removeByBizIdAndBizType(
    									@RequestBody 
                                        AttachmentRemoveDTO dto) {
    attachmentService.removeByBizIdAndBizType(dto.getBizId(), 
                                              dto.getBizType());
    return success(true);
}

第二步:在AttachmentService接口中扩展removeByBizIdAndBizType方法

/**
* 根据业务id/业务类型删除附件
*
* @param bizId
* @param bizType
*/
void removeByBizIdAndBizType(String bizId, String bizType);

第三步:在AttachmentServiceImpl实现类中实现removeByBizIdAndBizType方法

/**
* 根据业务id和业务类型删除附件
*
* @param bizId
* @param bizType
*/
@Override
public void removeByBizIdAndBizType(String bizId, String bizType) {
    //根据业务类和业务id查询数据库
    List<Attachment> list = super.list(
        Wraps.<Attachment>lbQ()
        .eq(Attachment::getBizId, bizId)
        .eq(Attachment::getBizType, bizType));
    if (list.isEmpty()) {
        return;
    }
    
    //根据id删除文件
    remove(list.stream().mapToLong(
        Attachment::getId).boxed().toArray(Long[]::new));
}

5.5.3 接口测试

第一步:启动Nacos配置中心

第二步:启动Nginx服务

第三步:启动文件服务

第四步:访问接口文档,地址为http://localhost:8765/doc.html

可以看到pd_attachment表中对应的记录已经删除掉了,对应的文件也已经被删除掉了。

第2-1-2章 传统方式安装FastDFS-附FastDFS常用命令
第2-1-3章 docker-compose安装FastDFS,实现文件存储服务
第2-1-5章 docker安装MinIO实现文件存储服务-springboot整合minio-minio全网最全的资料

全套代码及资料全部完整提供,点此处下载

有关第2-3-5章 删除附件的接口开发-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  5. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  6. ruby-on-rails - 标准化文件名的字符串,删除重音和特殊字符 - 2

    我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin

  7. 阿里云国际版免费试用:如何注册以及注意事项 - 2

    作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。​关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐

  8. 阿里云RDS——产品系列概述 - 2

    基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于

  9. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  10. ruby - 如果它是标点符号,我怎么能从字符串中删除最后一个字符,在 ruby​​ 中? - 2

    啊,正则表达式有点困惑。我正在尝试删除字符串末尾所有可能的标点符号:ifstr[str.length-1]=='?'||str[str.length-1]=='.'||str[str.length-1]=='!'orstr[str.length-1]==','||str[str.length-1]==';'str.chomp!end我相信有更好的方法来做到这一点。有什么指点吗? 最佳答案 str.sub!(/[?.!,;]?$/,'')[?.!,;]-字符类。匹配这5个字符中的任何一个(注意,。在字符类中并不特殊)?-前一个字符或组

随机推荐