swift - 如何使用 AWSS3TransferUtility 将带有用户元数据的音频文件上传到 S3

标签 swift xcode amazon-web-services aws-amplify

我正在尝试允许用户将歌曲和元数据上传到 S3 文件夹。我在上传音频(.mp3、.wav 等)时遇到问题。

用户信息存储在 DynamoDB 表中,但我希望将实际歌曲存储在 s3 文件夹中,并让两者连接。

使用以下代码,我似乎只能上传音频文件 S3 的名称,但没有实际数据......我似乎无法弄明白。

import UIKit
import StoreKit
import AWSMobileClient
import AWSCognitoIdentityProvider
import AWSAppSync
import MediaPlayer
import AVKit
import AVFoundation
import MediaAccessibility
import MediaToolbox



class mediaUploadVC: UITableViewController, UINavigationControllerDelegate, MPMediaPickerControllerDelegate{

    fileprivate let BUCKETNAME = "newtbxbkt-newtbxeniv"


    var avMusicPlayer = MPMusicPlayerController.systemMusicPlayer
    var mpMediapicker: MPMediaPickerController!

    var mediaItems = [MPMediaItem]()

MPMusicPlayerController.systemMusicPlayer

    fileprivate let s3Service: S3Service = S3Service()

    override func viewDidLoad() {
        super.viewDidLoad()

    }



    @IBAction func pickSongBtn(_ sender: UIView) {

          mpMediapicker  = MPMediaPickerController.self(mediaTypes:MPMediaType.music)
          mpMediapicker .allowsPickingMultipleItems = false
          mpMediapicker .popoverPresentationController?.sourceView = sender as? UIView
          mpMediapicker .delegate = self

        self.present(mpMediapicker , animated: true, completion: nil)



    }

    func mediaPicker(_ mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {

        avMusicPlayer.setQueue(with: mediaItemCollection)
        mediaPicker.dismiss(animated: true, completion: nil)

        avMusicPlayer.play()


    }


    @IBAction func uploadData(_ data: Any) {


        let data: Data = Data() // Data to be uploaded

        let expression = AWSS3TransferUtilityUploadExpression()
        expression.progressBlock = {(task, progress) in
            DispatchQueue.main.async(execute: {

                print("upload in progress")
                // Do something e.g. Update a progress bar.
            })
        }

        var completionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock?
        completionHandler = { (task, error) -> Void in
            DispatchQueue.main.async(execute: {
                if let _ = error {
                    print ("There was an error uploading files... \(error.debugDescription)")
                    print ("Let us check response \(String(describing: task.response?.allHeaderFields))")
                    print ("Let us check response \(String(describing: task.response?.debugDescription))")
                } else {
                    print("Completed uploading file...")
                }
            })
        }
        userAPI.getuserId { (userCognitoId) in
            let transferUtility = AWSS3TransferUtility.default()

            transferUtility.uploadData(data,
                                       bucket: self.BUCKETNAME,
                                       key: "protected/\(userCognitoId)/song1.mp3",
                contentType: "audio/mp3",
                expression: expression,
                completionHandler: completionHandler).continueWith {
                    (task) -> AnyObject? in
                    if let error = task.error {
                        print("Error: \(error.localizedDescription)")
                    }

                    if let _ = task.result {
                        // Do something with uploadTask.
                    }
                    return nil;
            }
        }
    }

    }

最佳答案

let data: Data = Data()

这是违规行。

目前,您正在上传一个空数据。您需要将要上传的文件内容转换为该数据并上传。

根据评论进行编辑:
要从系统上给定 URL 的文件中检索数据,您可以调用

let fileURL: URL = ... // get a reference to the URL 
if let data = try? Data(contentsOf: fileURL) {
    // now you have the data
}

AWSS3TransferUtilityUploadTask 有另一个初始化程序,它将 URL 作为参数,这在您的情况下可能更简单。

获取 MPMediaItem 的数据包括获取其 assetURL、创建 AVAsset 并使用 AVAssetExportSession将数据写入系统上的 URL(通常在临时目录中)。

这里还有其他帖子更详细地介绍了如何导出 MPMediaItem Assets 数据,您应该可以轻松搜索到这些帖子。

iOS 限制您只能访问包含在您的应用程序(或应用程序组)沙盒目录中的文件,因此不要指望您能够从设备中获取任何数据。

关于swift - 如何使用 AWSS3TransferUtility 将带有用户元数据的音频文件上传到 S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57683050/

相关文章:

ios - 在 realm 中保存数据模型对象数组只保存 1 个属性,其余属性我在 realm studio 中看不到

ios - Xcode Instrument 中 SCNNodes 上 SCNAudioPlayer 的持久化

xcode - 我真的很难将数据向后传输到 UIView Controller

javascript - 收到错误来源 'null' 已被 CORS 策略阻止?

mysql - "Can' t 连接到 MySQL 服务器”,仅当客户端是远程服务器时

amazon-web-services - 使用比较运算符的 DynamoDB 查询

swift - 调度队列异步调用

ios - .Repeat .AutoReverse 不起作用

ios - 在 native 模块库中找不到 ios 框架 header

ios - Swift 为什么我的函数调用只在 viewDidLoad 中有效