如何正确使用AnonFiles API上传文件?Go代码返回空值求助
Go语言调用AnonFiles API上传文件返回空值问题
我正在编写一个Go语言函数,计划通过AnonFiles API将文件托管到anonfiles.com网站。尽管我认为自己正确使用了该API,但它始终返回空值,且提示“Response is missing message”。以下是我的代码:
func host(file string) { fileBytes, err := ioutil.ReadFile(file) if err != nil { fmt.Println("\033[1;31mCommand > Host: Could not read file,", err, "\033[0m") return } url := "https://api.anonfiles.com/upload" request, err := http.NewRequest("POST", url, bytes.NewBuffer(fileBytes)) if err != nil { fmt.Println("\033[1;31mCommand > Host: Could not post request,", err, "\033[0m") return } request.Header.Set("Content-Type", "application/octet-stream") client := &http.Client{} response, err := client.Do(request) if err != nil { fmt.Println("\033[1;31mCommand > Host: Could not send request,", err, "\033[0m") return } defer response.Body.Close() body, err := ioutil.ReadAll(response.Body) if err != nil { fmt.Println("\033[1;31mCommand > Host: Could not read response,", err, "\033[0m") return } var result map[string]interface{} err = json.Unmarshal(body, &result) if err != nil { fmt.Println("\033[1;31mCommand > Host: Could not parse response,", err, "\033[0m") return } if response.StatusCode == 200 { if result["url"] == nil { fmt.Println("\033[1;31mCommand > Host: Response is missing URL\033[0m") return } fmt.Println("File hosted successfully:", result["url"].(string)) } else { if result["message"] == nil { fmt.Println("\033[1;31mCommand > Host: Response is missing message\033[0m") return } fmt.Println("\033[1;31mCommand > Host:\033[0m", result["message"].(string)) } }
相关截图:
问题原因及修复方案
你的代码存在两个核心问题:
- 请求格式错误:AnonFiles API要求上传文件使用
multipart/form-data格式,而非直接传递文件字节流并设置application/octet-stream头,API无法识别当前请求体结构导致返回异常。 - 响应解析错误:AnonFiles返回数据为嵌套结构,成功响应的URL在
data.file.url.full路径下,错误信息在error.message路径下,直接读取顶层url或message字段会得到空值。
修改后的代码:
import ( "bytes" "encoding/json" "fmt" "io" "mime/multipart" "os" "net/http" ) func host(file string) { // 打开文件(避免一次性加载大文件到内存) f, err := os.Open(file) if err != nil { fmt.Println("\033[1;31mCommand > Host: Could not open file,", err, "\033[0m") return } defer f.Close() url := "https://api.anonfiles.com/upload" var requestBody bytes.Buffer writer := multipart.NewWriter(&requestBody) // 创建form字段"file"并写入文件内容 filePart, err := writer.CreateFormFile("file", f.Name()) if err != nil { fmt.Println("\033[1;31mCommand > Host: Could not create form file,", err, "\033[0m") return } _, err = io.Copy(filePart, f) if err != nil { fmt.Println("\033[1;31mCommand > Host: Could not copy file content,", err, "\033[0m") return } writer.Close() // 创建请求,使用自动生成的带boundary的Content-Type头 request, err := http.NewRequest("POST", url, &requestBody) if err != nil { fmt.Println("\033[1;31mCommand > Host: Could not create request,", err, "\033[0m") return } request.Header.Set("Content-Type", writer.FormDataContentType()) client := &http.Client{} response, err := client.Do(request) if err != nil { fmt.Println("\033[1;31mCommand > Host: Could not send request,", err, "\033[0m") return } defer response.Body.Close() body, err := io.ReadAll(response.Body) if err != nil { fmt.Println("\033[1;31mCommand > Host: Could not read response,", err, "\033[0m") return } var result map[string]interface{} err = json.Unmarshal(body, &result) if err != nil { fmt.Println("\033[1;31mCommand > Host: Could not parse response,", err, "\033[0m") return } // 按嵌套结构解析响应数据 if status, ok := result["status"].(bool); ok && status { data := result["data"].(map[string]interface{}) fileData := data["file"].(map[string]interface{}) urlData := fileData["url"].(map[string]interface{}) fullURL := urlData["full"].(string) fmt.Println("File hosted successfully:", fullURL) } else { if errData, ok := result["error"].(map[string]interface{}); ok { message := errData["message"].(string) fmt.Println("\033[1;31mCommand > Host:\033[0m", message) } else { fmt.Println("\033[1;31mCommand > Host: Response is missing error message\033[0m") } } }
关键修改说明:
- 使用
multipart.Writer构建符合API要求的表单请求,将文件作为file字段上传 - 改用
os.Open和io.Copy处理文件,优化大文件上传的内存占用 - 按照AnonFiles实际响应结构解析数据,正确获取文件URL或错误信息
- 依赖
writer.FormDataContentType()自动生成带boundary的请求头,避免手动配置错误
内容的提问来源于stack exchange,提问作者iVers
相关产品推荐
相关产品推荐

