我已经用UIImagePickerController将用户手机上的照片上传到Firebase,但使用UIDocentPickerController时,我加载了pdf和类似的格式,但它加载了一个空文件,当我试图下载我上传的文件时,它下载了一个空文件--我是SWIFT新手,有人能帮助我吗?

import UIKit
import Firebase
import MobileCoreServices
class DocViewController: UIViewController & UIDocumentPickerDelegate & UINavigationControllerDelegate{
@IBOutlet weak var docImage: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()
    
    // Do any additional setup after loading the view.
    let hideKeyboardGesture = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
    view.addGestureRecognizer(hideKeyboardGesture)
    docImage.isUserInteractionEnabled = true
    let docGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(selectDocument))
    docImage.addGestureRecognizer(docGestureRecognizer)
}
@objc func hideKeyboard(){
    view.endEditing(true)
}
@objc func selectDocument(){
    let documentPicker = UIDocumentPickerViewController(documentTypes: [String(kUTTypePDF)], in: .open)
    documentPicker.delegate = self
    documentPicker.modalPresentationStyle = .fullScreen
    documentPicker.allowsMultipleSelection = false
    documentPicker.directoryURL = .documentsDirectory
    present(documentPicker, animated: true, completion: nil)
}
func alertFunc(titleInput:String, messageInput: String){
    let alert = UIAlertController(title: titleInput, message: messageInput, preferredStyle: UIAlertController.Style.alert)
    let okButton = UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil)
    alert.addAction(okButton)
    self.present(alert, animated: true, completion: nil)
}

@IBAction func uploadClicked(_ sender: Any) {
    let storage = Storage.storage()
    let storageReference = storage.reference()
    let newData = Data()
    let newUuid = UUID().uuidString
    let mediaFolder = storageReference.child("Documents")
    let newDocumentReference = mediaFolder.child("\(newUuid).pdf")
    newDocumentReference.putData(newData, metadata: nil) { metadata, error in
     if error != nil {
     self.alertFunc(titleInput: "Error", messageInput: error?.localizedDescription ?? "Error!!!")
     } else{
     newDocumentReference.downloadURL { url, error in
     if error == nil{
     let documentUrl = url?.absoluteString
     let documentFirestore = Firestore.firestore()
     var documentFirestoreReference : DocumentReference? = nil
     let firestorePost = ["imageUrl": documentUrl!, "PostedBy": Auth.auth().currentUser!.email!, "Date": FieldValue.serverTimestamp()] as [String : Any]
     documentFirestoreReference = documentFirestore.collection("Documents").addDocument(data: firestorePost, completion: { error in
     if error != nil {
     self.alertFunc(titleInput: "Error!!!", messageInput: error?.localizedDescription ?? "Error!!!")
     } else {
     self.tabBarController?.selectedIndex = 0
     }
     })
     }
     }
     
     }
     }
    
}

    
}

推荐答案

Thanks to people who tried to help.
I solved it like this:

import UIKit
import Firebase
import MobileCoreServices

class DocViewController: UIViewController & UIDocumentPickerDelegate & UINavigationControllerDelegate{
    @IBOutlet weak var docImage: UIImageView!
    var docUrl : URL? = nil
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Do any additional setup after loading the view.
        let hideKeyboardGesture = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
        view.addGestureRecognizer(hideKeyboardGesture)
        docImage.isUserInteractionEnabled = true
        let docGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(selectDocument))
        docImage.addGestureRecognizer(docGestureRecognizer)
        
        
    }
   
    @objc func hideKeyboard(){
        view.endEditing(true)
    }
    @objc func selectDocument(){
        let documentPicker = UIDocumentPickerViewController(documentTypes: [String(kUTTypeItem)], in: .open)
        documentPicker.delegate = self
        documentPicker.modalPresentationStyle = .fullScreen
        documentPicker.allowsMultipleSelection = false
        present(documentPicker, animated: true, completion: nil)
    }
    
    func alertFunc(titleInput:String, messageInput: String){
        let alert = UIAlertController(title: titleInput, message: messageInput, preferredStyle: UIAlertController.Style.alert)
        let okButton = UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil)
        alert.addAction(okButton)
        self.present(alert, animated: true, completion: nil)
    }
    func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
        docUrl = urls.first
        docImage.image = UIImage(systemName: "checkmark.icloud.fill")
        self.dismiss(animated: true, completion: nil)
    }
    
    @IBAction func uploadClicked(_ sender: Any) {
        docUrl!.startAccessingSecurityScopedResource() //this is important for not getting permission error 
        let data = try! Data(contentsOf: docUrl!)
        docUrl!.stopAccessingSecurityScopedResource()
        let storage = Storage.storage()
        let storageReference = storage.reference()
        let newUuid = UUID().uuidString
        let documentFolder = storageReference.child("Documents")
        let fileExtension = docUrl!.pathExtension
        let fileReference = documentFolder.child("\(newUuid).\(fileExtension)")
        fileReference.putData(data) { metadata, error in
            if error != nil {
                self.alertFunc(titleInput: "Error!!!", messageInput: error?.localizedDescription ?? "Error")
            } else {
                fileReference.downloadURL { url, error in
                    if error == nil {
                        let documentUrl = url?.absoluteString
                        let documentFirestore = Firestore.firestore()
                        var documentFirestoreReference : DocumentReference? = nil
                        let firestorePost = ["imageUrl": documentUrl!, "PostedBy": Auth.auth().currentUser!.email!, "Date": FieldValue.serverTimestamp()] as [String : Any]
                        documentFirestoreReference = documentFirestore.collection("Posts").addDocument(data: firestorePost, completion: { error in
                            if error != nil {
                                self.alertFunc(titleInput: "Error2!!!", messageInput: error?.localizedDescription ?? "Error2!!!")
                            } else {
                                self.tabBarController?.selectedIndex = 0
                            }
                        })
                    }
                }
            }
        }
        }
        }

Ios相关问答推荐

如何让AVAudio.installTap()每秒回调125次

如何从ipad获取用户定义的设备名称,IOS版本应大于16在flutter

在带有可编码的SWIFT5中,可以轻松处理以美元符号开头的JSON密钥,例如$DATE";

在某些情况下,UIHostingController在自动调整时不能调整大小

IFrame内容拒绝仅在iOS浏览器上加载-即使发布了内容-安全-策略(CSP)框架-祖先指令

在滚动视图中固定页眉,但在页眉上方嵌入元素

为什么EKEventStore().questFullAccessToEvents()可以与模拟器一起使用,而不能与真实设备一起使用?

Swift-如何通过Case Let访问模型变量

执行devicectl:ProcessException时出错:进程异常退出:错误:命令超时超过5.0秒

在我的 M1 上出现 Architecture arm64 问题,因此我无法运行我的旧项目

如何让替换视图淡入旧视图而不是交叉淡入淡出?

包装在 AnyView 中时 UIViewControllerRepresentable 无法正常工作

如何让我的 iOS 应用程序与 api 连接?

Apple Push Service 证书不受信任

UICollectionView 添加 UICollectionCell

如何在键盘上方添加工具栏?

如何进行键值观察并在 UIView 的框架上获取 KVO 回调?

从 Swift 转换为 Objective-c 的工具

在 NSUserDefaults 中存储值是否有任何限制?

SwiftUI 应用生命周期 iOS14 AppDelegate 代码放哪里?