我正在尝试允许用户将歌曲和元数据上传到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;
}
}
}
}发布于 2019-08-28 07:56:54
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资产数据,您应该能够轻松地进行搜索。
iOS限制您只能访问包含在您的应用程序(或应用程序组)沙箱目录中的文件,所以不要期望您能够从设备获取任何数据。
https://stackoverflow.com/questions/57683050
复制相似问题