英文:
Uploading the files and folders using Go to the box account
问题
以下是您提供的代码的翻译:
对于下面的程序,我得到了以下错误。如果有人能帮助我修复错误,将非常有帮助。提前感谢。
func upload() {
fmt.Println("dfxfgcghvjbjhiiiiiiiiiiiiiiiiiii")
apiUrl := "https://upload.box.com/"
resource := "api/2.0/files/content"
data := url.Values{}
data.Add("access_token", accessobj.Access_token)
authbear := "Bearer "
authbear += accessobj.Access_token
u, _ := url.ParseRequestURI(apiUrl)
u.Path = resource
urlStr := fmt.Sprintf("%v", u)
client := &http.Client{}
fmt.Println(urlStr)
f, err := ioutil.ReadFile("C:\\Users\\vembu\\Desktop\\hi.txt")
ioutil.WriteFile("hi.txt", f, 0x777)
r, _ := http.NewRequest("POST", urlStr, bytes.NewBuffer(f))
r.Header.Add("Authorization", "Bearer "+accessobj.Access_token)
r.Header.Add("attributes",
"{\"name\":\"hi.txt\",\"parent\":{\"id\":\"3098791209\"}}")
r.Header.Add("file", "hi.txt")
fmt.Println(r)
if err != nil {
fmt.Println("error......:", err)
}
resp, err1 := client.Do(r)
if err1 != nil {
fmt.Println("error:", err1)
}
fmt.Println("uploading")
fmt.Println(resp)
re, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("errorrrrr:", err)
}
fmt.Println(string(re))
}
我得到了以下错误:
我遇到了 &{405 Method Not Allowed 405 HTTP/1.1 1 1 map[Allow:[GET, OPTIONS, HEAD] Content-Type:[text/html;charset=UTF-8] Content-Length:[0] Date:[Thu, 12 Mar 2015 13:07:32 GMT] Age:[0] Connection:[keep-alive] Server:[ATS]] 0xc08200b8c0 0 [] false map[] 0xc08201f2b0 0xc082060980}
。
英文:
For the program below I get the below error. It will be helpful if anyone helps me to fix my errors. Thanks in advance.
func upload() {
fmt.Println("dfxfgcghvjbjhiiiiiiiiiiiiiiiiiii")
apiUrl := "https://upload.box.com/"
resource := "api/2.0/files/content"
data := url.Values{}
data.Add("access_token", accessobj.Access_token)
authbear := "Bearer "
authbear += accessobj.Access_token
u, _ := url.ParseRequestURI(apiUrl)
u.Path = resource
urlStr := fmt.Sprintf("%v", u)
client := &http.Client{}
fmt.Println(urlStr)
f, err := ioutil.ReadFile("C:\\Users\\vembu\\Desktop\\hi.txt")
ioutil.WriteFile("hi.txt", f, 0x777)
r, _ := http.NewRequest("POST", urlStr, bytes.NewBuffer(f))
r.Header.Add("Authorization", "Bearer "+accessobj.Access_token)
r.Header.Add("attributes",
"{\"name\":\"hi.txt\",\"parent\":{\"id\":\"3098791209\"}}")
r.Header.Add("file", "hi.txt")
fmt.Println(r)
if err != nil {
fmt.Println("error......:", err)
}
resp, err1 := client.Do(r)
if err1 != nil {
fmt.Println("error:", err1)
}
fmt.Println("uploading")
fmt.Println(resp)
re, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("errorrrrr:", err)
}
fmt.Println(string(re))
}
I get the following error:
I face &{405 Method Not Allowed 405 HTTP/1.1 1 1
map[Allow:[GET, OPTIONS, HEAD] Content-Type:[text/html;charset=UTF-8]
Content-Length:[0] Date:[Thu, 12 Mar 2015 13:07:32 GMT] Age:[0]
Connection:[keep-alive]
Server:[ATS]] 0xc08200b8c0 0 [] false map[] 0xc08201f2b0 0xc082060980}
答案1
得分: 2
问题在于你尝试进行一个HTTP POST
请求:
r, _ := http.NewRequest("POST", urlStr, bytes.NewBuffer(f))
但是服务器不允许/支持这样做,如响应错误中所述(只允许GET
、OPTIONS
和HEAD
方法):
> Method Not Allowed 405 HTTP/1.1 1 1 map[Allow:[GET, OPTIONS, HEAD]
根据box.com API,要使用POST
上传文件,你需要使用多部分表单上传请求。
你可以使用multipart
包创建一个带有文件的多部分请求。
以下是一个示例代码(不完整/未经测试):
buf := &bytes.Buffer{}
mw := multipart.NewWriter(buf)
defer mw.Close()
f, err := os.Open("C:\\Users\\vembu\\Desktop\\hi.txt")
if err != nil {
// 处理错误
}
defer f.Close()
ff, err := mw.CreateFormFile("name", "hi.txt")
if err != nil {
// 处理错误
}
if _, err = io.Copy(ff, f); err != nil {
// 处理错误
}
// TODO: 在URL中包含其他字段/参数
r, err := http.NewRequest("POST", "https://upload.box.com/api/2.0/files/content", buf)
if err != nil {
// 处理错误
}
r.Header.Set("Content-Type", mw.FormDataContentType())
// TODO: 添加其他头字段
// 发起调用:上传文件
client := &http.Client{}
resp, err := client.Do(r)
if err != nil {
// 处理错误
}
if resp.StatusCode != http.StatusOK {
fmt.Printf("错误:%v", resp.Status)
}
英文:
The problem is that you try to do an HTTP POST
request:
r, _ := http.NewRequest("POST", urlStr, bytes.NewBuffer(f))
But the server does not allow/support this as stated in the response error (only GET
, OPTIONS
and HEAD
methods are allowed):
> Method Not Allowed 405 HTTP/1.1 1 1 map[Allow:[GET, OPTIONS, HEAD]
According to the box.com API to upload a file using POST
you need to use a multi-part form upload request.
You can use the multipart
package to create a multipart request with a file.
Here is an example how to do it (incomplete/untested code):
buf := &bytes.Buffer{}
mw := multipart.NewWriter(buf)
defer mw.Close()
f, err := os.Open("C:\\Users\\vembu\\Desktop\\hi.txt")
if err != nil {
// Handle error
}
defer f.Close()
ff, err := mw.CreateFormFile("name", "hi.txt")
if err != nil {
// Handle error
}
if _, err = io.Copy(ff, f); err != nil {
// Handle error
}
// TODO: INCLUDE OTHER FIELDS/PARAMS IN URL
r, err := http.NewRequest("POST", "https://upload.box.com/api/2.0/files/content", buf)
if err != nil {
// Handle error
}
r.Header.Set("Content-Type", mw.FormDataContentType())
// TODO: ADD YOUR OTHER HEADER FIELDS
// Do the call: upload file
client := &http.Client{}
resp, err := client.Do(r)
if err != nil {
// Handle error
}
if resp.StatusCode != http.StatusOK {
fmt.Printf("Error: %v", resp.Status)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论