IM项目——文件管理子服务

1.引言

文件管理子服务实现起来比较简单,就是提供文件的上传和下载接口。也不涉及数据库表的设计,所以直接进入代码部分。

2.代码实现

**单文件下载流程:**文件的唯一标识是文件ID(file_id),所以首先提取出请求中的文件ID,明确要下载的文件,然后通过file_id去获取文件的内容,写入到响应中,返回给客户端(网关)即可。

cpp 复制代码
 void GetSingleFile(google::protobuf::RpcController* controller,
            const ::pcz::GetSingleFileReq* request,
            ::pcz::GetSingleFileRsp* response,
            ::google::protobuf::Closure* done) {
            brpc::ClosureGuard done_guard(done);
            // 1.获取文件ID
            std::string file_id = request->file_id();
            // 2. 获取文件内容
            std::string file_name = _storage_path + file_id;
            std::string file_body;
            if (pcz::readFile(file_name, file_body) == false) {
                LOG_ERROR("下载文件失败 {}!", request->request_id());
                response->set_request_id(request->request_id());
                response->set_success(false);
                response->set_errmsg("下载文件失败!");
                return;
            }
            // 3.组织响应
            response->set_request_id(request->request_id());
            response->set_success(true);
            response->mutable_file_data()->set_file_id(file_id);
            response->mutable_file_data()->set_file_content(file_body);
        }

单文件的上传流程:每一个文件,都需要有一个文件ID,所以首先要给上传的这个文件生成一个文件ID,然后再将文件的内容进行存储。

cpp 复制代码
 void PutSingleFile(google::protobuf::RpcController* controller,
            const ::pcz::PutSingleFileReq* request,
            ::pcz::PutSingleFileRsp* response,
            ::google::protobuf::Closure* done) {
            brpc::ClosureGuard done_guard(done);
            // 1.生成文件ID,即文件名
            std::string file_id = pcz::uuid();
            // 2.获取文件内容并写入文件
            std::string file_name = _storage_path + file_id;
            std::string file_body = request->file_data().file_content();
            if (pcz::writeFile(file_name, file_body) == false) {
                LOG_ERROR("上传文件失败 {}!", request->request_id());
                response->set_request_id(request->request_id());
                response->set_success(false);
                response->set_errmsg("上传文件失败!");
                return;
            }
            // 3.组织响应
            response->set_success(true);
            response->set_request_id(request->request_id());
            response->mutable_file_info()->set_file_id(file_id);
            response->mutable_file_info()->set_file_name(request->file_data().file_name());
            response->mutable_file_info()->set_file_size(request->file_data().file_size());
        }

这些文件,都是保存在本地磁盘的,上传的本质就是调用系统调用write(),下载的本质就是调用系统调用read()。

3.结语

除了单文件的上传和下载外,还有多文件的上传和下载,它们本质是一样的,实现的思路也是一样的。


相关推荐
一叶飘零_sweeeet2 小时前
别等业务中断才补坑!RTO/RPO 核心逻辑与全场景灾备架构选型全攻略
数据库·架构·容灾备份
码农颜2 小时前
6.1.2 常⽤⽅法的问题
数据库·sql·oracle
量子炒饭大师2 小时前
MySQL 5.7 在 CentOS 7 环境安装:从清理 MariaDB 到初始化与完善配置
数据库·mysql·centos·mariadb
明志数科2 小时前
宇树科技IPO背后的产业逻辑:人形机器人从“讲故事“到“交数据“
运维·服务器·数据库
淼澄研学2 小时前
基于RAG与Milvus向量数据库的搜题长尾问题检索实操教程
数据库·milvus
Dovis(誓平步青云)2 小时前
DevEco Studio 6.1.1 Windows 安装实录:从下载校验到首次启动
android·开发语言·数据库·人工智能·windows·harmonyos
Data_Journal2 小时前
什么是 CAPTCHA,它是如何工作的?
java·大数据·服务器·前端·数据库
霸道流氓气质3 小时前
Redis Pub/Sub — 概念、原理、场景与代码示例
数据库·redis·缓存
AC赳赳老秦3 小时前
语义采集进阶实战:利用 OpenClaw AI 语义识别自动提取网页核心信息,无需手动编写选择器
java·运维·服务器·python·信息可视化·deepseek·openclaw
我星期八休息3 小时前
扩展—DNS与ICMP
linux·服务器·网络