使用七牛的sdk上传报错:incorrect region

乐正浩宕
2023-12-01

报错响应大致如下

exception:None, status_code:404, _ResponseInfo__response:<Response [404]>, text_body:{"error":"incorrect region"}, req_id:xxxxxxxxxxx, error:incorrect region, x_log:IO/404

原因是根据空间所在区域不同,七牛的上传域名也不同,华东、华南、华北、北美对应不同的上传域名。指定的上传域名不属于空间所在区域对应的域名导致报错。

七牛的机房上传域名链接

可以单独指定某一域名进行上传,也可以调用v1接口获取该空间对应的上传域名

https://uc.qbox.me/v1/query?ak={ak}&bucket={bucket}

返回的响应格式如下

{
    "ttl":86400,
    "http":{
        "io":[
            "http://iovip.qbox.me"
        ],
        "up":[
            "http://up.qiniu.com",
            "http://upload.qiniu.com",
            "-H up.qiniu.com http://183.131.7.18"
        ]
    },
    "https":{
        "io":[
            "https://iovip.qbox.me"
        ],
        "up":[
            "https://up.qbox.me",
            "https://upload.qbox.me"
        ]
    }
}

或者调用v2接口

https://uc.qbox.me/v1/query?ak={ak}&bucket={bucket}

返回的响应格式如下

{
    "ttl":86400,
    "io":{
        "src":{
            "main":[
                "iovip.qbox.me"
            ]
        }
    },
    "up":{
        "acc":{
            "main":[
                "upload.qiniup.com"
            ],
            "backup":[
                "upload-nb.qiniup.com",
                "upload-xs.qiniup.com"
            ]
        },
        "old_acc":{
            "main":[
                "upload.qbox.me"
            ],
            "info":"compatible to non-SNI device"
        },
        "old_src":{
            "main":[
                "up.qbox.me"
            ],
            "info":"compatible to non-SNI device"
        },
        "src":{
            "main":[
                "up.qiniup.com"
            ],
            "backup":[
                "up-nb.qiniup.com",
                "up-xs.qiniup.com"
            ]
        }
    }
}

然后再选择想要上传的域名。

在七牛sdk里上传域名的选择流程为

  1. 第一次上传调用v1或v2接口
  2. 将结果持久化保存。不同语言有不同的实现方式。例如在本地临时文件夹下创建.qiniu_pythonsdk_hostscache.json json文件并保存(python);或者创建类buildFromUcRet保存上传值(java);或者赋值给类里的某个属性(php)。
  3. 下次再次上传,优先从持久化的地方读取上传域名。

因此,如果使用最新sdk出现该报错,可以从json文件或者变量中查看上传域名是否属于自己空间所在区域。如果不符合,检查sdk版本,重启程序或删除临时文件。

ps:

python获取临时文件目录的方法

import tempfile
print(tempfile.gettempdir())
 类似资料: