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