繁体   English   中英

如何在照片库中获取URL?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM