首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用AWSS3TransferUtility将包含用户元数据的音频文件上传到S3

如何使用AWSS3TransferUtility将包含用户元数据的音频文件上传到S3
EN

Stack Overflow用户
提问于 2019-08-28 06:42:45
回答 1查看 406关注 0票数 1

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

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

使用下面的代码,我似乎只能上传音频文件S3的名称,而没有实际的数据……我似乎想不通了。

代码语言:javascript
复制
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

代码语言:javascript
复制
    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;
            }
        }
    }

    }
EN

回答 1

Stack Overflow用户

发布于 2019-08-28 07:56:54

代码语言:javascript
复制
let data: Data = Data()

这是令人不快的一行。

此时,您正在上载一个空数据。您需要将您希望上传的文件内容转换为该数据,并上传该数据。

响应评论进行编辑:

要从系统上给定URL处的文件检索数据,可以调用

代码语言:javascript
复制
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限制您只能访问包含在您的应用程序(或应用程序组)沙箱目录中的文件,所以不要期望您能够从设备获取任何数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57683050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档