gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:22:27 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com