2 回答

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超13個(gè)贊
這有3個(gè)部分:
創(chuàng)建一個(gè)從
multipart.Reader
events.APIGatewayProxyRequest
獲取啞劇部分
提取啞劇部件值
步驟 1:創(chuàng)建multipart.Reader
取一個(gè) 和 字符串,如簽名所示:multipart.NewReader
io.Reader
boundary
func NewReader(r io.Reader, boundary string) *Reader
為此,您需要從 HTTP 請(qǐng)求標(biāo)頭中提取邊界字符串,這可以使用 來(lái)完成。Content-Type
mime.ParseMediaType
執(zhí)行此操作的一種簡(jiǎn)單方法是從具有以下簽名的 go-awslambda
包中調(diào)用:NewReaderMultipart
func NewReaderMultipart(req events.APIGatewayProxyRequest) (*multipart.Reader, error)
步驟 2:獲取 MIME 部件
獲得 后,導(dǎo)航 MIME 消息,直到找到所需的 MIME 部分。mime.Reader
在這里的示例中,只有一個(gè)部分,因此您可以簡(jiǎn)單地調(diào)用:
part, err := reader.NextPart()
步驟 3:提取 MIME 部件值
獲得 MIME 部件后,可以提取所需的值。
步驟 3.1:內(nèi)容
content, err := io.ReadAll(part)
步驟 3.2:文件名
從 MIME 部件獲取文件名,如下所示:
filename := part.FileName()
步驟 3.3: 文件擴(kuò)展名
叫。這將在擴(kuò)展中添加前導(dǎo)句點(diǎn),但這可以很容易地刪除。path/filepath.Ext
.
ext := filepath.Ext(part.FileName())
總結(jié)
您可以按如下方式進(jìn)行組合:
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
}

TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊
上面的答案看起來(lái)是正確的方法,但是如果你很懶惰(正如我:p),你可以創(chuàng)建一個(gè)HTTP請(qǐng)求,讓本機(jī)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 case
for name, value := range req.Headers {
httpReq.Header.Add(name, value)
}
// from here you can use httpReq.FormFile() to read the file
- 2 回答
- 0 關(guān)注
- 120 瀏覽
添加回答
舉報(bào)