【问题标题】:How do I upload audio file with user Metadata to S3 using AWSS3TransferUtility如何使用 AWSS3TransferUtility 将带有用户元数据的音频文件上传到 S3
【发布时间】:2019-08-27 22:42:44
【问题描述】:

我正在尝试允许用户将歌曲和元数据上传到 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;
            }
        }
    }

    }

【问题讨论】:

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


    【解决方案1】:
    let data: Data = Data()
    

    这是违规行。

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

    编辑以响应 cmets:
    要从系统上给定 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 资产数据,您应该可以轻松搜索。

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

    【讨论】:

    • 如何转换(mp3 或 .wav)文件的文件内容?我为我的无知道歉,我还在学习这方面的很多东西。
    • 根据您发布的代码,您似乎正试图从MPMediaItem 中获取数据,对吗?
    • 是和不是。我想让用户能够从他们设备上的任何地方抓取音乐。我只是不确定如何允许他们访问其他文件夹。
    • 我已经编辑了我的答案以回应您的澄清。希望这能让您了解如何进行。
    • 感谢您回来。那么我是否只需替换“let data:Data = Data()”。使用您提供的代码。 "let fileURL: URL = ... // 获取对 URL 的引用 if let data = try? Data(contentsOf: fileURL) { // 现在你有了数据 }"
    猜你喜欢
    • 1970-01-01
    • 2017-11-14
    • 2021-11-06
    • 2022-09-28
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    相关资源
    最近更新 更多