当前位置:

首页 > 编程开发 > 如何在 Golang 中使用 gRPC 实现文件上传?

如何在 Golang 中使用 gRPC 实现文件上传?

如何使用gRPC实现文件上传?创建配套服务定义,包括请求和响应消息。在客户端,打开要上传的文件并将其分成块,然后通过gRPC流流式传输发送到服务端。在服务端,接收文件块并将其存储到文件中。服务端在文件上传完成后发送响应,指示上传是否成功。

本文目录

    如何使用 gRPC 实现文件上传?创建配套服务定义,包括请求和响应消息。在客户端,打开要上传的文件并将其分成块,然后通过 gRPC 流流式传输发送到服务端。在服务端,接收文件块并将其存储到文件中。服务端在文件上传完成后发送响应,指示上传是否成功。

    如何在 Golang 中使用 gRPC 实现文件上传?

    如何在 Golang 中使用 gRPC 实现文件上传

    gRPC(Google远程过程调用)是一个通用的、高性能的、开源的远程过程调用框架,可以在任何环境中运行。它提供了在不同的机器之间传输数据的有效方式,并且非常适合需要在分布式系统中传输大型文件的情况。

    配套服务

    在开始之前,你需要创建一个配套服务来处理文件上传。以下是一个示例服务定义:

    // 文件上传服务接口
    syntax = "proto3";
    
    package file_upload;
    
    service FileUploadService {
      rpc Upload(stream FileChunk) returns (FileUploadResponse);
    }
    
    // 文件块信息
    message FileChunk {
      bytes data = 1;
    }
    
    // 文件上传响应
    message FileUploadResponse {
      bool success = 1;
    }

    gRPC 客户端实现

    使用 gRPC 的客户端实现文件上传过程如下:

    package main
    
    import (
        "context"
        "io"
        "log"
    
        file_upload "github.com/example/file-upload"
        "google.golang.org/grpc"
    )
    
    func main() {
        // 建立与服务的连接
        conn, err := grpc.Dial("127.0.0.1:50051", grpc.WithInsecure())
        if err != nil {
            log.Fatalf("连接服务失败: %v", err)
        }
        defer conn.Close()
    
        // 创建文件上传客户端
        client := file_upload.NewFileUploadServiceClient(conn)
    
        // 打开要上传的文件
        file, err := os.Open("example.txt")
        if err != nil {
            log.Fatalf("打开文件失败: %v", err)
        }
        defer file.Close()
    
        // 将文件分成块进行流式传输
        stream, err := client.Upload(context.Background())
        if err != nil {
            log.Fatalf("创建流式传输失败: %v", err)
        }
    
        // 循环读取文件并发送块
        buf := make([]byte, 1024)
        for {
            n, err := file.Read(buf)
            if err == io.EOF {
                break
            }
            if err != nil {
                log.Fatalf("读取文件失败: %v", err)
            }
    
            // 发送块
            if err := stream.Send(&file_upload.FileChunk{Data: buf[:n]}); err != nil {
                log.Fatalf("发送块失败: %v", err)
            }
        }
    
        stream.CloseSend()
    
        // 接收上传响应
        resp, err := stream.Recv()
        if err != nil {
            log.Fatalf("接收上传响应失败: %v", err)
        }
    
        log.Printf("上传成功: %v", resp.Success)
    }

    配套服务实现

    服务端实现接收和处理上传文件的逻辑:

    package main
    
    import (
        "context"
        "io"
        "log"
    
        file_upload "github.com/example/file-upload"
    )
    
    func main() {
        // 创建文件上传服务
        server := &FileUploadService{}
    
        // 创建 gRPC 服务器并注册服务
        s := grpc.NewServer()
        file_upload.RegisterFileUploadServiceServer(s, server)
    
        lis, err := net.Listen("tcp", "127.0.0.1:50051")
        if err != nil {
            log.Fatalf("监听端口失败: %v", err)
        }
    
        // 启动 gRPC 服务器
        if err := s.Serve(lis); err != nil {
            log.Fatalf("启动 gRPC 服务器失败: %v", err)
        }
    }
    
    // FileUploadService 服务的具体实现
    type FileUploadService struct{}
    
    func (s *FileUploadService) Upload(stream file_upload.FileUploadService_UploadServer) error {
        file, err := os.Create("received.txt")
        if err != nil {
            return err
        }
    
        for {
            chunk, err := stream.Recv()
            if err == io.EOF {
                break
            }
            if err != nil {
                return err
            }
    
            if _, err := file.Write(chunk.GetData()); err != nil {
                return err
            }
        }
    
        if err := stream.SendAndClose(&file_upload.FileUploadResponse{Success: true}); err != nil {
            return err
        }
    
        return nil
    }

    以上代码展示了如何在 Golang 中使用 gRPC 实现文件上传。客户端将文件分成块并通过流式传输发送到服务端,服务端则负责接收和处理上传的文件。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 文件上传
    相关文章 更多
    vue上传文件格式怎么设置及要求说明
    vue上传文件格式怎么设置及要求说明

    学习如何在Vue项目中设置文件上传格式限制。本文介绍使用HTML accept属性进行基础过滤,以及结合JavaScript进行严格后缀名校验的方法,确保只允许指定类型的文件被上传。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    前端文件上传接口怎么传使用FormData提交文件教程
    前端文件上传接口怎么传使用FormData提交文件教程

    详解如何使用原生 JavaScript 和 FormData 对象实现前端文件上传,涵盖单文件、多文件提交及进度监听,无需依赖重型库,提升代码可控性。

    xshell上传文件的方法教程及具体操作步骤
    xshell上传文件的方法教程及具体操作步骤

    遇到Xshell无法直接拖拽上传文件的困扰?本文详解如何通过安装lrzsz使用rz命令快速上传小文件,以及利用内置SFTP功能稳定传输大文件的具体操作步骤。

    PDF转TXT操作步骤与转换后内容核对指南
    PDF转TXT操作步骤与转换后内容核对指南

    本文详细介绍使用在线工具将PDF转换为TXT的操作流程,涵盖从文件上传、格式转换到结果下载的全过程。重点讲解转换后如何核对段落顺序、检查乱码与缺字,以及处理扫描版PDF的识别问题,确保导出文本准确无误。

    JSP实现文件上传功能
    JSP实现文件上传功能

    文件上传在Web开发中算是高频需求了,JSP配合Servlet实现时,有几个关键点很容易踩坑。下面就把完整流程拆开来讲,从依赖包到页面再到后台处理,一步步说清楚。 一、准备部分 需要两个JAR包:fileupload.jar 和 io.jar。构建好路径后就可以继续了。 二、页面部分 学号: 姓名:

    input的accept属性让文件上传安全高效
    input的accept属性让文件上传安全高效

    HTML的accept属性可在文件选择器中自动过滤不支持的文件类型,减少用户误选,从而降低前端校验代码量,提升上传体验。但该属性仅用于优化用户体验,不能替代后端安全验证,必须结合服务器端校验确保文件安全。

    如何修复Safari浏览器在执行大规模文件上传时中断的问题?
    如何修复Safari浏览器在执行大规模文件上传时中断的问题?

    Safari上传大文件中断源于WebKit内存映射与macOS内存压缩策略冲突。解决措施包括:改用原生表单提交绕过JS内存分配、禁用WebKitMemoryPressureRelief、启用传统上传通道及清理上传缓存,其中前两种方案效果显著。

    Safari浏览器如何解决网页中Input File文件上传框无法选择多个文件?
    Safari浏览器如何解决网页中Input File文件上传框无法选择多个文件?

    iOSSafari16.4及以上版本支持inputfile多选,旧版本需移除multiple属性并分批上传,或动态检测版本启用。隐藏input应改用clip方式,避免display:none。同时确保正确遍历files对象及FormData同名append。

    ThinkPHP 8.0 文件上传 OSS 整合教程【保姆级】
    ThinkPHP 8.0 文件上传 OSS 整合教程【保姆级】

    ThinkPHP8.0整合阿里云OSS上传采用配置驱动机制,通过安装SDK、设置环境变量、启用OSS磁盘实现统一调用。控制器上传需校验文件类型,用uniqid重命名并按日期分目录存储,防止路径穿越。可选直传签名用于大文件前端上传。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。