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()
,从而从下载服务器中抽取数据并将其发送到上载服务器。这一切都是自动发生的。