lambda 多部分/文件上传

我需要对使用 Go 通过 AWS Lambda 上传的上传文件的内容进行一些简单的操作,但不确定如何解析接收内容,因为我是 Go 的新手。到目前为止,我发现的解决方案与http包和多部分表单功能有关。


type Request events.APIGatewayProxyRequest


func Handler(ctx context.Context, req Request) (Response, error) {

fmt.Println(req.Body)

....

}

这就是我的请求正文的样子


------WebKitFormBoundaryx0SVDelfa90Fi5Uo

Content-Disposition: form-data; name="file"; filename="upload.txt"

Content-Type: text/plain


this is content


------WebKitFormBoundaryx0SVDelfa90Fi5Uo--

我的请求是 的实例。APIGatewayProxyRequest


我想知道是否有可能获得一个自定义结构,从中我可以访问f.e.等数据。


customStruct.content => "this is content"

customStruct.fileName => upload.txt

customStruct.fileExtension => txt


SMILET
浏览 135回答 2
2回答

开满天机

这有3个部分:创建一个从multipart.Readerevents.APIGatewayProxyRequest获取哑剧部分提取哑剧部件值步骤 1:创建multipart.Reader取一个 和 字符串,如签名所示:multipart.NewReaderio.Readerboundaryfunc NewReader(r io.Reader, boundary string) *Reader为此,您需要从 HTTP 请求标头中提取边界字符串,这可以使用 来完成。Content-Typemime.ParseMediaType执行此操作的一种简单方法是从具有以下签名的 go-awslambda 包中调用:NewReaderMultipartfunc NewReaderMultipart(req events.APIGatewayProxyRequest) (*multipart.Reader, error)步骤 2:获取 MIME 部件获得 后,导航 MIME 消息,直到找到所需的 MIME 部分。mime.Reader在这里的示例中,只有一个部分,因此您可以简单地调用:part, err := reader.NextPart()步骤 3:提取 MIME 部件值获得 MIME 部件后,可以提取所需的值。步骤 3.1:内容content, err := io.ReadAll(part)步骤 3.2:文件名从 MIME 部件获取文件名,如下所示:filename := part.FileName()步骤 3.3: 文件扩展名叫。这将在扩展中添加前导句点,但这可以很容易地删除。path/filepath.Ext.ext := filepath.Ext(part.FileName())总结您可以按如下方式进行组合:import (    "context"    "encoding/json"    "io"    "github.com/aws/aws-lambda-go/events"    "github.com/grokify/go-awslambda")type customStruct struct {    Content       string    FileName      string    FileExtension string}func handleRequest(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {    res := events.APIGatewayProxyResponse{}    r, err := awslambda.NewReaderMultipart(req)    if err != nil {        return res, err    }    part, err := r.NextPart()    if err != nil {        return res, err    }    content, err := io.ReadAll(part)    if err != nil {        return res, err    }    custom := customStruct{        Content:       string(content),        FileName:      part.FileName(),        FileExtension: filepath.Ext(part.FileName())}    customBytes, err := json.Marshal(custom)    if err != nil {        return res, err    }    res = events.APIGatewayProxyResponse{        StatusCode: 200,        Headers: map[string]string{            "Content-Type": "application/json"},        Body: string(customBytes)}    return res, nil}

UYOU

上面的答案看起来是正确的方法,但是如果你很懒惰(正如我:p),你可以创建一个HTTP请求,让本机lib为你工作:httpReq, err := http.NewRequestWithContext(ctx, req.HTTPMethod, reqURL.String(), strings.NewReader(req.Body))if err != nil {    return nil, errors.New("failed to convert a lambda req into a http req")}// some headers may be important, let get all of them, just in casefor name, value := range req.Headers {    httpReq.Header.Add(name, value)}// from here you can use httpReq.FormFile() to read the file
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go