天天看点

记录下阿里云OSS直传的心酸历程

在使用DjangoRestFrameWork编写上传接口的过程中前端要求使用JS验签直传,这样的好处就是略过了服务器作为中转站的过程,传输速率也更快。至于OSS直传的简介,就不赘述了,官方文档很全,需要的点击官方详解,这里直接进入正题。

官方文档提供了服务端和客户端的源码,作为后端我们只需要下载服务端源码即可,当然,为了调试也可以下载客户端源码,打开index.html进行调试。

打开源码内的appserver.py对xxx填充的地方进行配置。

# 栗子  http://chezhudianping.oss-cn-shanghai.aliyuncs.com/uploads/20190605/05/1_2x.jpg
# 请填写您的AccessKeyId。
access_key_id = 'xxxx'
# 请填写您的AccessKeySecret。
access_key_secret = 'xxxxx'
# host的格式为 bucketname.endpoint ,请替换为您的真实信息。
host = 'http://xxxxxx.oss-cn-xxxxxxx.aliyuncs.com';
# callback_url为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
callback_url = "http://xxx.xxx.xxx.xxx:xxx";
# 用户上传文件时指定的前缀。
upload_dir = 'uploads/' + time.strftime("%Y%m%d", time.localtime()) + '/' + time.strftime("%d", time.localtime()) + '/' 
expire_time = 360
           
def get_local_ip():
    """
    获取本机 IPV4 地址
    :return: 成功返回本机 IP 地址,否则返回空
    """
    try:
        csocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        csocket.connect(('xxx.xxx.xxx.xxx', xxxx))
        (addr, port) = csocket.getsockname()
        csocket.close()
        return addr
    except socket.error:
        return ""
           
if '__main__' == __name__:
    # 在服务器中, 0.0.0.0指的是本机上的所有IPV4地址, 如果一个主机有两个IP地址,
    # 192.168.1.1 和 10.1.2.1, 并且该主机上的一个服务监听的地址是0.0.0.0, 那么通过两个IP地址都能够访问该服务。
    # server_ip = get_local_ip() 若用户希望监听本机外网IPV4地址,则采用本行代码并注释掉下一行代码
    server_ip = "0.0.0.0"
    server_port = xxxx
    if len(sys.argv) == 2:
        server_port = int(sys.argv[1])
    if len(sys.argv) == 3:
        server_ip = sys.argv[1]
        server_port = int(sys.argv[2])
    print("App server is running on http://%s:%s " % (server_ip, server_port))

    server = httpserver.MyHTTPServer(server_ip, server_port)
    server.serve_forever()

           

修改完以后将这两个.py文件放在一起,在项目里新建一个文件夹,放在里面,然后将项目传到服务器(本地也可调试)。进入该文件夹运行

python appserver.py

即可运行,api地址为你配置的:xxx.xxx.xxx.xxx:xxx。

测试环境截图如下:

记录下阿里云OSS直传的心酸历程

到此基本使用全部结束,临时身份可参考官方授权访问。