阿里云OSS链接去掉签名信息

Table of Contents

    要想去掉阿里云oss链接中的签名信息,至少要将此object设置为public read,也就是这个链接是公开的任何人都可以读,而且没有时间限制。 这可能会造成访问量增大新增很多额外成本,这个一定要考虑清楚。

    在下面上传字节流到oss的函数中新增了permission参数,要将其设置为oss2.OBJECT_ACL_PUBLIC_READ

        def upload_bytes(self, object_key: str = "", data: bytes = b"", **kwargs) -> dict:
            """
            上传字节流到 OSS
            """
            result = self._bucket.put_object(object_key, data=data)
            if kwargs.get("permission"):
                self._bucket.put_object_acl(object_key, kwargs["permission"])
    
            # HTTP返回码。
            self._logger.debug("http status: %s", result.status)
            # 请求ID。请求ID是本次请求的唯一标识,强烈建议在程序日志中添加此参数。
            self._logger.debug("request_id: %s", result.request_id)
            # ETag是put_object方法返回值特有的属性,用于标识一个Object的内容。
            self._logger.debug("ETag: %s", result.etag)
            # HTTP响应头部。
            self._logger.debug("date: %s", result.headers["date"])
            return {
                "status": result.status,
                "request_id": result.request_id,
                "etag": result.etag,
                "date": result.headers["date"],
            }
    

    public read权限上传的字节流可以直接通过object_key拼接出url,不需要额外去服务器请求,如下:

    def get_oss_public_url(object_key: str) -> str:
        assert OSS_ENDPOINT is not None
        assert OSS_BUCKET_NAME is not None
        pos = OSS_ENDPOINT.find("//")
        if pos:
            url = f"{OSS_ENDPOINT[0:pos+2]}{OSS_BUCKET_NAME}.{OSS_ENDPOINT[pos+2:]}"
        else:
            url = f"https://{OSS_BUCKET_NAME}.{OSS_ENDPOINT}"
        return f"{url}{object_key}" if url.endswith("/") else f"{url}/{object_key}"
    

    否则,你需要通过如下方式去获取url:

        def get_download_url(self, object_key):
            if self._bucket.object_exists(object_key):
                return self._bucket.sign_url("GET", object_key, 15 * 24 * 3600)