【问题标题】:Upload to backblaze from client从客户端上传到后台
【发布时间】:2016-09-29 23:53:30
【问题描述】:

有没有办法从客户端直接上传到backblaze? 现在图像从客户端上传到 php 然后再到 backblaze,所以一个文件被上传了两次。 我可以将文件从 Javascript 发送到 backblaze 吗?

【问题讨论】:

  • 什么是Backblaze?它是如何工作的?他们在上传之前是否使用某种验证过程?请添加有关 Backblaze api 的更多详细信息。不要指望我们会神奇地知道第 3 方软件的工作原理。
  • 您不能通过 JSON 和 Backblaze API 上传文件:backblaze.com/b2/docs/calling.html 吗?该 API 似乎只能通过 B2 Cloud Storage 获得,因此您可能需要为 API 调用付费。
  • @MasudM 你找到解决方案了吗?你能和我们分享你的发现吗
  • @medBo 不幸的是,我找不到解决方案。我尝试联系支持人员,他们说这还不可能。就我而言,我切换到允许跨域资源共享(又名 CORS)的 AWS S3。
  • @MasudM。现在有可能,我认为:backblaze.com/b2/docs/cors_rules.html

标签: javascript php image api upload


【解决方案1】:

我认为可以直接上传,因为 CORS 现在可用于 b2。直接用ajax post文件上传文件。

第 1 步。 使用账号ID和应用密钥获取authorizationToken令牌

第 2 步。 使用上面的authorizationToken获取上传url。

第 3 步。 将此 url 发送到客户端浏览器并将文件直接上传到 b2。

问题:如果您需要 sha1 进行验证,这仅适用于支持 HTML5 的浏览器。 在这里阅读更多

Is it possible to compute a file's SHA1 ID using Javascript?

https://developer.mozilla.org/en-US/docs/Web/API/File

https://www.backblaze.com/b2/docs/b2_upload_file.html

【讨论】:

  • 不错的答案@Vishvendra Singh
  • 但是是否也可以从客户端获取authorizationToken和uploadUrl?
【解决方案2】:

对于仍在寻找解决方案的任何人,您现在可以使用 S3 预签名 URL。以下是步骤

1- 从您的前端/JS 向服务器(在本例中为 PHP)发送 GET/POST 请求,请求预签名 URL

$b2 = new Aws\S3\S3Client([
        'version' => 'latest',
        'endpoint' => 'https://xxx.backblazeb2.com',
        'region' => 'eu-xxx-xxx',
        'credentials' => array(
            'key'    => $_ENV['B2_KEY'],
            'secret' => $_ENV['B2_SECRKET'],
        )
    ]);

$cmd = $b2->getCommand('PutObject', [
            'Bucket' => $bucketName,
            'Key' => $subFolder . "" . $fileName,
            'ContentType' => $fileType,
        ]);
    
    
        $request = $b2->createPresignedRequest($cmd, '+20 minutes');
    
        // Get the actual presigned-url
        $presignedUrl = (string)$request->getUri();
    
        echo $presignedUrl;
    

2- 在前面获取您的回复,然后使用预签名的 URL 代码上传您的文件(以 Axios 为例)

axios
     .put(b2PreSignedUrl, myFile)
     .then(response => {
     console.log(" -> B2 upload status " + JSON.stringify(response))

      }).catch(e => {
        console.log(" -> Error uploading video to B2 " + e)
       })

但最重要的是(否则您将收到 CORS 错误或超时错误),您需要通过命令行工具为存储桶创建自定义 CORS。这是我的 CORS 设置和 CLI 命令

b2 update-bucket --corsRules '[    
          {
              "corsRuleName": "downloadFromAnyOriginWithUpload",
              "allowedOrigins": [
                  "*"
              ],
              "allowedOperations": [
                  "s3_delete",
                  "s3_get",
                  "s3_head",
                  "s3_post",
                  "s3_put"
              ],
              "maxAgeSeconds": 3600
          }
      ]' <BUCKETNAME> allPublic

【讨论】:

    猜你喜欢
    • 2017-08-21
    • 2021-03-19
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 2018-11-02
    相关资源
    最近更新 更多