背景:
以前在使用华为obs 进行图片下载(也就是浏览器查看图片),是直接使用地址访问obs。 比如: endpoint: obs-example-domain.cn 图片名称: qcx%2F1%2F20210804%2F2db3c4bb-0c2c-4c3c-84e0-7e131c1e8db61628047890560.jpg
访问地址:
http://obs-example-domain.cn/qcx%2F1%2F20210804%2F2db3c4bb-0c2c-4c3c-84e0-7e131c1e8db61628047890560.jpg
wget 以上地址就可以下载图片。
但是使用python sdk 访问就会报错:
AK = 'PLAU4DD8EYVXSA****UL'
SK = 'MdNZCKgSwt9Qgq6ZXtaF7wtZOd8********xEiv'
server = "http://obs-example-domain.cn"
bucketName = 'qcx'
obsClient = ObsClient(access_key_id=AK, secret_access_key=SK, server=server)
name = "qcx%2F1%2F20210804%2F2db3c4bb-0c2c-4c3c-84e0-7e131c1e8db61628047890560.jpg"
resp = obsClient.getObject(bucketName, name, loadStreamInMemory=True)
print(resp.body)
输出: The specified key does not exist
以上程序中: name = qcx%2F1%2F20210804%2F2db3c4bb-0c2c-4c3c-84e0-7e131c1e8db61628047890560.jpg
解决方法:
上面的 图片名称实际是进行了urlencode。 原始字符串URLDecode可以获得:
qcx/1/20210804/2db3c4bb-0c2c-4c3c-84e0-7e131c1e8db61628047890560.jpg
将以上的代码中的name 改为 URLdecode后的图片名称, 即:
name = "qcx/1/20210804/2db3c4bb-0c2c-4c3c-84e0-7e131c1e8db61628047890560.jpg"
就能正确获取图片。
该功能完成代码
图片浏览完成线路:
浏览器 请求 img url -> nginx -> api (带 sk ak) -> obs -> 响应 api -> nginx -> 浏览器
python 2.7 (服务器上只有这个版本,还不能升级到3.x)
#coding=utf-8
from BaseHTTPServer import BaseHTTPRequestHandler
import urllib
import cgi
import os
import urllib
# print urllib.unquote('%E4%B8%89%E7%94%9F%E4%B8%89%E4%B8%96')
from obs import ObsClient
AK = 'PLAU4DD8EYVXSA****UL'
SK = 'MdNZCKgSwt9Qgq6ZXtaF7wtZOd8********xEiv'
server = "http://obs.cn-dchlw-1.digitalgd.com.cn"
bucketName = 'qcxx'
obsClient = ObsClient(access_key_id=AK, secret_access_key=SK, server=server)
cwd = os.getcwd()
class ObsHandler(BaseHTTPRequestHandler):
def do_GET(self):
path = urllib.unquote(self.path)
buf = ""
query_list = path.split("/") #会自动进行urldecode
#print(query_list)
if query_list[1] == "obs":
name = "/".join(query_list[3:]).replace("?","") # for online
#name = urllib.unquote(name)
resp = obsClient.getObject(bucketName, name, loadStreamInMemory=True)
if resp.status < 300:
self.send_response(200)
buf = resp.body.buffer
else:
self.send_response(400)
self.end_headers()
self.wfile.write(buf)
def StartServer():
from BaseHTTPServer import HTTPServer
sever = HTTPServer(("",12000),ObsHandler)
sever.serve_forever()
if __name__=='__main__':
StartServer()
参考资料: The specified key does not exist” https://blog.csdn.net/lp19861126/article/details/106901443
|