Go 如何在不保存到磁盘上的情况下发布多部分映像?

Go 如何在不保存到磁盘上的情况下发布多部分映像?,go,Go,我需要下载一个图像并上传到另一个服务。是否可以在不保存到磁盘的情况下上载它?我检查了文件,但我找不到任何直接的方法,甚至不能从磁盘上传/发布多个部分。 到目前为止,我有这个非工作代码 func upf(file []byte) (url string, err error) { URL := "http:///max.com/upimg" b := bytes.Buffer writer := multipart.NewWriter(b) part, err

我需要下载一个图像并上传到另一个服务。是否可以在不保存到磁盘的情况下上载它?我检查了文件,但我找不到任何直接的方法,甚至不能从磁盘上传/发布多个部分。 到目前为止,我有这个非工作代码

func upf(file []byte) (url string, err error) {

    URL := "http:///max.com/upimg"
    b := bytes.Buffer
    writer := multipart.NewWriter(b)

    part, err := writer.CreateFormField(file)
    if err != nil {
        return nil, err
    }

    err = writer.Close()
    if err != nil {
        return nil, err
    }

    return http.NewRequest("POST", URL, b)
}
如果需要发布多部分,则必须对响应的主体进行编码

buffer := bytes.NewBuffer(nil)

encoder := multipart.NewWriter(buffer)

field, error := encoder.CreateFormField("image") // Set "image" to correct field name

if error != nil {
    // handle error
}

_, error = io.Copy(field, response.Body) 

if error != nil {
    // handle error
}

// and then Post buffer instead of response.Body
请记住将POST请求中正确的
内容类型
标题(例如http.POST的第二个参数)设置为如下内容:

"multipart/form-data; boundary=" + encoder.Boundary()
如果需要发布多部分,则必须对响应的主体进行编码

buffer := bytes.NewBuffer(nil)

encoder := multipart.NewWriter(buffer)

field, error := encoder.CreateFormField("image") // Set "image" to correct field name

if error != nil {
    // handle error
}

_, error = io.Copy(field, response.Body) 

if error != nil {
    // handle error
}

// and then Post buffer instead of response.Body
请记住将POST请求中正确的
内容类型
标题(例如http.POST的第二个参数)设置为如下内容:

"multipart/form-data; boundary=" + encoder.Boundary()

我得到这个错误:单值上下文中的多值编码器.CreateFormField()是的,我的代码有一个bug(已编辑),但请不要从internet复制粘贴代码。以此为指导,;试着理解代码。我试着理解代码,但它没有真正的意义。@TheUserwithnothat,意思是
response.Body
是实现
io.ReadClose
接口的东西——也就是说,你可以反复调用
Read()
,直到它发出
EOF
(此时
Close()
被自动调用。)@userwithnohat,
http.Client
Post()
方法以
io.Reader
为例,http响应对象的
Body
成员也满足这个接口(
io.ReadCloser
io.Reader
+
io.Closer
),因此您只需将GET-response的
Body
作为POST的Body参数传递,就可以看到神奇的效果:执行HTTP POST的代码将使用表示HTTP GET响应主体的对象来获取用于发布的数据——通过反复调用
Read()
在它上面,因此从下载服务器排出数据并将其发送到上载服务器。这一切都是由它自己发生的。我得到了以下错误:单值上下文中的多值编码器。CreateFormField()是的,我的代码有一个bug(已编辑)但是,请不要从internet上复制粘贴代码。将其作为一个指南;尝试理解代码。我试图理解代码,但它没有真正的意义。@usernohat,意思是
response.Body
是实现
io.ReadClose
接口的东西——也就是说,您可以反复调用
Read()
,直到它发出
EOF
(自动调用
Close()
)的信号。@UserWithNoHat,
http.Client
Post()
方法以
io.Reader
为例——http响应对象的
主体
成员也满足的接口(
io.ReadCloser
io.Reader
+
io.Closer
),因此您只需将GET-response的
Body
作为POST的Body参数传递,就可以看到神奇的发生:执行HTTP-POST的代码将使用表示HTTP-GET响应的Body的对象来获取发布数据——通过反复调用
Read()
,从而从下载服务器中抽取数据并将其发送到上载服务器。这一切都是自动发生的。