[英]How to know other users displayName and photo url using Firebase?
[英]How to get URL in Photo Library?
我正在挑选一个视频,我想将它上传到 Firebase 但我的代码有错误。 我认为错误是因为 URL。我尝试了很多方法来获取 URL,但没有任何效果。
这是我的代码如下:
@IBAction func showImagePicker() {
let picker = UIImagePickerController()
picker.delegate = self
picker.allowsEditing = false
picker.sourceType = .savedPhotosAlbum
picker.mediaTypes = [kUTTypeMovie as String]
picker.videoQuality = .typeIFrame1280x720
self.present(picker, animated: true, completion: nil)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true, completion: nil);
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
picker.dismiss(animated: true, completion: nil)
let videoName = UUID().uuidString
let url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent(videoName)
print("videoName: \(videoName)")
print("url: \(url)")
let metadata = StorageMetadata() //get metadata of firebase
metadata.contentType = "video/quicktime"
let storageRef = storage.reference() //get storage reference of the firebase storage
let videoRef = storageRef.child("videos/\(videoName)") //Get a folder where the video will be saved
videoRef.putFile(from: url, metadata: nil) { (metadata, error) in //uploading to the firebase storage folder
guard let metadata = metadata else {
//If there is error in meta data, print "error"
print("error\(error)")
return
}
print("Put us complete and I got this back: \(String(describing: metadata))")
// Metadata contains file metadata such as size, content-type.
let size = metadata.size
// Access to download URL after upload.
videoRef.downloadURL { (url, error) in
guard let downloadURL = url else {
print("Got an generating the URL:)")
// Uh-oh, an error occurred!
return
}
}
}
print("Done")
}
这是下面的错误:
可选(错误域=FIRStorageErrorDomain 代码=-13000“文件位于 URL:file:///var/mobile/Containers/Data/Application/3BE603CC-A936-43CF-8127-EB224EC0D7ED/Documents/96267AEB-F61D-4985-8C6D- FD641DEAD72D 不可访问。确保文件 URL 不是目录、符号链接或无效的 url。”UserInfo={NSLocalizedDescription=URL 处的文件:file:///var/mobile/Containers/Data/Application/3BE603CC-A936-43CF -8127-EB224EC0D7ED/Documents/96267AEB-F61D-4985-8C6D-FD641DEAD72D 不可访问。确保文件 URL 不是目录、符号链接或无效的 url。})
我要将选中的视频上传到Firebase存储。
我最近完成了上传视频到 Firebase 存储。 试试这个:
对于视频选择器:
import Foundation
import SwiftUI
import PhotosUI
struct VideoPicker: UIViewControllerRepresentable {
var onVideoPicked : (URL, String) -> Void
func makeUIViewController(context: Context) -> PHPickerViewController {
var config = PHPickerConfiguration()
config.filter = .videos
let picker = PHPickerViewController(configuration: config)
picker.delegate = context.coordinator
return picker
}
func updateUIViewController(_ uiViewController: PHPickerViewController, context: Context) {}
func makeCoordinator() -> Coordinator {
Coordinator(self, onVideoPicked: self.onVideoPicked)
}
class Coordinator:NSObject, PHPickerViewControllerDelegate{
let parent:VideoPicker
var onVideoPicked : (URL, String) -> Void
init(_ parent: VideoPicker, onVideoPicked: @escaping (URL, String) -> Void){
self.parent = parent
self.onVideoPicked = onVideoPicked
}
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
picker.dismiss(animated: true) {
// do something on dismiss
}
guard let provider = results.first?.itemProvider else {return}
provider.loadFileRepresentation(forTypeIdentifier: "public.movie") { url, error in
guard error == nil else{
print(error?.localizedDescription ?? "")
return
}
// receiving the video-local-URL / filepath
guard let url = url else {return}
// create a new filename
let fileName = "\(Int(Date().timeIntervalSince1970)).\(url.pathExtension)"
// create new URL
let newUrl = URL(fileURLWithPath: NSTemporaryDirectory() + fileName)
// copy item to APP Storage
try? FileManager.default.copyItem(at: url, to: newUrl)
self.onVideoPicked(newUrl, fileName)
}
}
}
}
这将返回您的视频 URL和视频名称
在 SwiftUIView 中使用它作为:
.sheet(isPresented: $vm.openVideos, content: {
VideoPicker(onVideoPicked: { url, videoName in
let videoRef = storageRef.child("videos/\(videoName)")
videoRef.putFile(from: url, metadata: nil) { metadata, error in
if error != nil {
Helper.shared.printDebug("\(String(describing: error)) and \(error?.localizedDescription ?? "error")")
return
}
videoRef.downloadURL(completion: { url, error in
guard let url = url else {
print("Failed to get download url")
return
}
print(url.absoluteString)
})
}
})
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.