登录
首页 >  Golang >  Go问答

发送上传的文件

来源:stackoverflow

时间:2024-04-20 21:03:49 396浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《发送上传的文件》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

我使用 echo 框架来构建 rest api。 我通过 http 请求接收文件,我需要通过 post 请求将其发送到下一个 api 服务。 我如何在不存储文件的情况下做到这一点?

我已经尝试过这种方式,但感觉不对,因为我的响应错误“无法将内容解析为 formdata”

func (h *Handler) UploadFile(c echo.Context) error {
    formFile, err := c.FormFile("file")
    if err != nil {
        return err
    }

    file, err := formFile.Open()
    if err != nil {
        return err
    }
    defer file.Close()

    cid, err := h.s.Upload(context.Background(), file)
    if err != nil {
        return err
    }

    return c.String(http.StatusOK, "Ok")

}

func (s *Storage) Upload(ctx context.Context, file io.Reader) (cid.Cid, error) {
    req, err := http.NewRequest(http.MethodPost, s.config.endpoint+"/upload", file)
    if err != nil {
        return cid.Undef, err
    }
    req.Header.Set("accept", "application/json")
    req.Header.Set("Content-Type", "multipart/form-data")
    req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", s.config.token))
    res, err := s.config.hc.Do(req)
    if err != nil {
        return cid.Undef, err
    }
    d := json.NewDecoder(res.Body)
    if res.StatusCode != 200 {
        return cid.Undef, fmt.Errorf("unexpected response status: %d", res.StatusCode)
    }
    var out struct {
        Cid string `json:"cid"`
    }
    err = d.Decode(&out)
    if err != nil {
        return cid.Undef, err
    }
    return cid.Parse(out.Cid)
}

正确答案


这里是解决方案。 谢谢弗拉德·弗拉多夫

func (s *Storage) Upload(ctx context.Context, file multipart.File, fileHeader *multipart.FileHeader) (cid.Cid, error) {
    rCtx, cancel := context.WithTimeout(ctx, 30*time.Second)
    defer cancel()

    buf := new(bytes.Buffer)
    writer := multipart.NewWriter(buf)

    part, err := writer.CreateFormFile("file", fileHeader.Filename)
    if err != nil {
        return cid.Undef, err
    }

    b, err := ioutil.ReadAll(file)

    if err != nil {
        return cid.Undef, err
    }

    part.Write(b)
    writer.Close()
    req, err := http.NewRequestWithContext(rCtx, http.MethodPost, s.config.endpoint+"/upload", buf)
    if err != nil {
        return cid.Undef, err
    }

    req.Header.Set("Content-Type", writer.FormDataContentType())
    req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", s.config.token))
    req.Header.Set("X-Client", "web3.storage/go")

    res, err := s.config.hc.Do(req)
    if err != nil {
        return cid.Undef, err
    }

    d := json.NewDecoder(res.Body)
    if res.StatusCode != 200 {
        var out responseError
        d.Decode(&out)
        log.Error(out)
        return cid.Undef, fmt.Errorf("unexpected response status: %d", res.StatusCode)
    }
    var out struct {
        Cid string `json:"cid"`
    }
    err = d.Decode(&out)
    if err != nil {
        return cid.Undef, err
    }
    return cid.Parse(out.Cid)
}

到这里,我们也就讲完了《发送上传的文件》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>