GRPC: 如何实现文件上传 Restful API ?-阿里云开发者社区

开发者社区> 尹东勋> 正文

GRPC: 如何实现文件上传 Restful API ?

简介: 本文将介绍如何在 gRPC 微服务中实现文件上传 Restful API。
+关注继续查看

介绍

本文将介绍如何在 gRPC 微服务中实现文件上传 Restful API。

为什么需要这么一篇文章?

gRPC 里我们可以通过 Streaming 来互传大文件,不过通过 grpc-gateway on gRPC 我们是无法实现的。
因此,需要绕过 gRPC 直接在 grpc-gateway 中添加 API。

我们将会使用 rk-boot 来启动 gRPC 服务。

请访问如下地址获取完整教程:

安装

go get github.com/rookie-ninja/rk-boot

快速开始

rk-boot 默认集成了 grpc-gateway,并且会默认启动。

1.创建 boot.yaml

---
grpc:
  - name: greeter                   # Name of grpc entry
    port: 8080                      # Port of grpc entry
    enabled: true                   # Enable grpc entry

2.创建 main.go

注意,grpcEntry.GwMux.HandlePath() 一定要写到 boot.Bootstrap() 之后,否则会出现 Panic。

package main

import (
    "context"
    "fmt"
    "github.com/rookie-ninja/rk-boot"
    "net/http"
)

// Application entrance.
func main() {
    // Create a new boot instance.
    boot := rkboot.NewBoot()

    // Bootstrap
    boot.Bootstrap(context.Background())

    // Get grpc entry with name
    grpcEntry := boot.GetGrpcEntry("greeter")

    // Attachment upload from http/s handled manually
    grpcEntry.GwMux.HandlePath("POST", "/v1/files", handleBinaryFileUpload)

    // Wait for shutdown sig
    boot.WaitForShutdownSig(context.Background())
}

func handleBinaryFileUpload(w http.ResponseWriter, req *http.Request, params map[string]string) {
    err := req.ParseForm()
    if err != nil {
        http.Error(w, fmt.Sprintf("failed to parse form: %s", err.Error()), http.StatusBadRequest)
        return
    }

    f, header, err := req.FormFile("attachment")
    if err != nil {
        http.Error(w, fmt.Sprintf("failed to get file 'attachment': %s", err.Error()), http.StatusBadRequest)
        return
    }
    defer f.Close()

    fmt.Println(header)

    //
    // Now do something with the io.Reader in `f`, i.e. read it into a buffer or stream it to a gRPC client side stream.
    // Also `header` will contain the filename, size etc of the original file.
    //
}

3.验证

$ curl -X POST -F "attachment=@xxx.txt" localhost:8080/v1/files

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Html5 学习系列(四)文件操作API
原文:Html5 学习系列(四)文件操作API 引言     在之前我们操作本地文件都是使用flash、silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很难进行跨平台、或者跨浏览器、跨设备等情况下实现统一的表现,从另外一个角度来说就是让我们的web应用依赖了第三方的插件,而不是很独立,不够通用。
669 0
修改文件后缀的C语言实现
        在实际的软件开发项目中,大家也许会遇到修改文件的后缀的需求(例如,将doc格式修改为docx格式)。本文提供了修改文件后缀的C语言实现,并演示了修改文件后缀的过程。
1200 0
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 32 章 回归测试_32.3. 变体比较文件
32.3. 变体比较文件 因为某些测试生来就会产生依赖环境的结果,我们提供了方法来指定替代的“预期”结果文件。每一个回归测试可以有多个比较文件来展示在不同平台上的可能结果。有两种独立的机制来决定为每一个测试使用哪个比较文件。
1028 0
+关注
尹东勋
点目科技创始人
60
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载