You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确使用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))
    }
}

相关截图:
API返回异常截图


问题原因及修复方案

你的代码存在两个核心问题:

  1. 请求格式错误:AnonFiles API要求上传文件使用multipart/form-data格式,而非直接传递文件字节流并设置application/octet-stream头,API无法识别当前请求体结构导致返回异常。
  2. 响应解析错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:05:53