菜鸟教程小白 发表于 2022-12-11 18:31:29

ios - 使用 Alamofire 将文件上传到 amazon s3


                                            <p><p>我正在使用 Alamofire 4.0 创建将文件直接上传到 S3 Amazon 的请求。</p>

<p>我正在使用 <a href="http://getcloudapp.com" rel="noreferrer noopener nofollow">GetCloudApp</a> 的服务.在我从 api <code>"https://my.cl.ly/v3/items</code> 请求 <code>Router.shared.prepareForUploadItem</code> 之后,我像这样检索 json</p>

<pre><code>{
&#34;slug&#34;: &#34;1h132K0z2n3G&#34;,
&#34;name&#34;: &#34;Image.png&#34;,
&#34;url&#34;: &#34;http://f.cl.ly&#34;,
&#34;uploads_remaining&#34;: 1,
&#34;max_upload_size&#34;: 26214400,
&#34;s3&#34;: {
    &#34;AWSAccessKeyId&#34;: &#34;AKIAJP2C6U543KJIE2GA&#34;,
    &#34;key&#34;: &#34;items/353u2B053p0H0D1O3w1b/${filename}&#34;,
    &#34;policy&#34;: &#34;eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0xMlQxMjo0MTozOFoiLCJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJjbG91ZGFwcC5jb3BwZXIuaW8ifSxbInN0YXJ0cy13aXRoIiwiJGtleSIsIml0ZW1zLzM1M3UyQjA1M3AwSDBEMU8zdzFiLyJdLHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiJodHRwOi8vbXkuY2wuZGV2L3YzL2l0ZW1zLzFoMTMySzB6Mm4zRy9zMyJ9LHsiYWNsIjoicHVibGljLXJlYWQifSxbImNvbnRlbnQtbGVuZ3RoLXJhbmdlIiwwLDI2MjE0NDAwXV19&#34;,
    &#34;signature&#34;: &#34;wqSVl9+fvkvtIzGfakNF+drqN0s=&#34;,
    &#34;success_action_redirect&#34;: &#34;http://api.cl.ly/v3/items/1h132K0z2n3G/s3&#34;,
    &#34;acl&#34;: &#34;public-read&#34;
}
}
</code></pre>

<p>我将这些 <code>key</code> 和 <code>value</code> 作为我的参数:</p>

<pre><code>&#34;AWSAccessKeyId&#34;: &#34;AKIAJP2C6U543KJIE2GA&#34;,
&#34;key&#34;: &#34;items/353u2B053p0H0D1O3w1b/${filename}&#34;,
&#34;policy&#34;: &#34;eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0xMlQxMjo0MTozOFoiLCJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJjbG91ZGFwcC5jb3BwZXIuaW8ifSxbInN0YXJ0cy13aXRoIiwiJGtleSIsIml0ZW1zLzM1M3UyQjA1M3AwSDBEMU8zdzFiLyJdLHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiJodHRwOi8vbXkuY2wuZGV2L3YzL2l0ZW1zLzFoMTMySzB6Mm4zRy9zMyJ9LHsiYWNsIjoicHVibGljLXJlYWQifSxbImNvbnRlbnQtbGVuZ3RoLXJhbmdlIiwwLDI2MjE0NDAwXV19&#34;,
&#34;signature&#34;: &#34;wqSVl9+fvkvtIzGfakNF+drqN0s=&#34;,
&#34;success_action_redirect&#34;: &#34;http://api.cl.ly/v3/items/1h132K0z2n3G/s3&#34;,
&#34;acl&#34;: &#34;public-read&#34;
</code></pre>

<p>然后我创建使用 <code>s3</code> 字典上传文件的请求,如下所示:</p>

<pre><code> Alamofire.upload(multipartFormData: { (multipartForm) in

for (key, value) in parameter {

    let valueData = value.data(using: .utf8, allowLossyConversion: false)

    guard let newData = valueData else{
      return
    }

    multipartForm.append(newData, withName: key)

    print(&#34;\(key) - \(value)&#34;)
}

multipartForm.append(data, withName: &#34;file&#34;)

}, to: s3.url, method : .post) { (encodingResult) in

switch encodingResult {
case .success(let upload, _, _):
    upload.responseJSON { response in
      debugPrint(response)
    }
case .failure(let encodingError):
    print(encodingError)
}
}
</code></pre>

<p>最后我像这样从服务器检索响应,我对身份验证了如指掌,但我真的不知道这样做的正确方法是什么。</p>

<pre><code>status code: 401, headers {
&#34;Cache-Control&#34; = &#34;no-cache&#34;;
Connection = &#34;keep-alive&#34;;
&#34;Content-Length&#34; = 28;
&#34;Content-Type&#34; = &#34;text/plain; charset=utf-8&#34;;
Date = &#34;Sun, 08 Jan 2017 17:37:17 GMT&#34;;
Server = &#34;nginx/1.4.6 (Ubuntu)&#34;;
Status = &#34;401 Unauthorized&#34;;
&#34;Www-Authenticate&#34; = &#34;Digest realm=\&#34;Application\&#34;, qop=\&#34;auth\&#34;, algorithm=MD5, nonce=\&#34;MTQ4Mzg5NzAzNzpiYmEwN2MzZDljM2RjNDMyMGE1NzI2ODQ5MjhjMWVkNQ==\&#34;, opaque=\&#34;9eb56ccb2e8b017ae42bdb4739690863\&#34;&#34;;
&#34;X-Request-Id&#34; = 7bd77581bf677aee1b1abba21b3ad097;
&#34;X-Runtime&#34; = &#34;0.004697&#34;;
&#34;X-UA-Compatible&#34; = &#34;IE=Edge,chrome=1&#34;;
</code></pre>

<p>我尝试了很多方法,但仍然没有运气,也无法成功。我真的需要帮助。提前致谢。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我知道为什么会出现这个问题,因为在我向 <code>CloudApp</code> 请求上传新文件后,我需要使用 <code>CloudApp</code> 的 Digest 验证我的上传请求到 S3 .</p>

<p>我将在下面发布我完成的代码:</p>

<pre><code>func uploadFileToS3(_ s3: S3, data : Data, fileName : String, mimeType : String) {

let params = s3.s3Parameter

Alamofire.upload(multipartFormData: { (multipartForm) in

for (key, value) in params{

    multipartForm.append(value.data(using: .utf8)!, withName: key)

}

multipartForm.append(data, withName: &#34;file&#34;, fileName: fileName, mimeType: mimeType)

}, to: s3.url, method : .post, headers:[&#34;Accept&#34;:&#34;application/json&#34;]) { (encodingResult) in

guard let userInfor = UserDefaults.standard.dictionary(forKey: &#34;UserInformation&#34;) else {
    return
}

switch encodingResult {
case .success(let upload, _, _):
    upload.authenticate(user: userInfor[&#34;email&#34;]! as! String, password: userInfor[&#34;password&#34;]! as! String)

    self.progressbar.isHidden = false
    upload.uploadProgress(closure: { (progress) in

      self.progressbar.progress = Float(progress.fractionCompleted)

    })

    upload.responseJSON{ response in

      self.progressbar.isHidden = true

      let result = JSON(response.result.value!)
      let file = CloudFile(fileInformation: result)

      self.files.append(file)

      let indexPath = IndexPath(row: 0, section: 0)

      DispatchQueue.main.async {
          self.filesTableView.insertRows(at: , with: .automatic)
      }

    }
case .failure(let encodingError):
    print(encodingError)
}
}
</code></pre>

<p>}</p>

<p>在 <code>encodingResult</code> 中注意到 <code>upload.authenticate(user: userInfor["email"]!as!String, password: userInfor["password"]!as!String)</code>结果完成句柄,这是您需要验证上传请求的地方。 Alamofire 将完成剩下的工作。</p>

<p>希望这会有所帮助。谢谢</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使用 Alamofire 将文件上传到 amazon s3,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/41535722/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/41535722/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使用 Alamofire 将文件上传到 amazon s3