【问题标题】:how do I get NSURL for an image froom UIImagePickerController? for upload to Firebase如何从 UIImagePickerController 获取图像的 NSURL?上传到 Firebase
【发布时间】:2016-10-28 02:27:26
【问题描述】:

因此已经启动了一些其他线程,因为人们对此有疑问。喜欢这个:Obtain NSURL from UIImagePickerController 和这个: Firebase storage upload works in Simulator but not on iPhone

我正在尝试遵循本教程: https://firebase.google.com/docs/storage/ios/upload-files#upload_from_a_local_file

我的视频可以上传,只是图片不行。

我的视频代码很简单:

if mediaType.isEqualToString(kUTTypeMovie as String) {
        let videoURL = info[UIImagePickerControllerMediaURL] as? NSURL

        fileToUploadURL = videoURL!
    }

但我的图像代码不起作用。这就是我最终得到的结果:

        let imageUrl = info["UIImagePickerControllerReferenceURL"] as? NSURL

        let assets = PHAsset.fetchAssetsWithALAssetURLs([imageUrl!], options: nil)
        let asset = assets.firstObject
        asset?.requestContentEditingInputWithOptions(nil, completionHandler: { (contentEditingInput, info) in
            let imageFile = contentEditingInput?.fullSizeImageURL
            // now call putFile with imageFile instead of imageUrl
            self.fileToUploadURL = imageFile
        })

似乎无论我做什么都会出错。 这是我当前的错误

2016-06-25 12:45:23.695 Chain[4187:1957121] Body file is unreachable: /var/mobile/Media/DCIM/100APPLE/IMG_0027.JPG
 Error Domain=NSCocoaErrorDomain Code=257 "The file “IMG_0027.JPG”       couldn’t be opened because you don’t have permission to view it."

控制台日志

2016-06-25 12:47:59.108 Chain[4187:1957121] 正文文件无法访问:/var/mobile/Media/DCIM/100APPLE/IMG_0027.JPG Error Domain=NSCocoaErrorDomain Code=257 "无法打开文件“IMG_0027.JPG”,因为您没有查看权限。" UserInfo={NSURL=file:///var/mobile/Media/DCIM/100APPLE/IMG_0027.JPG, NSFilePath=/var/mobile/Media/DCIM/100APPLE/IMG_0027.JPG, NSUnderlyingError=0x18b7ad40 {错误域=NSPOSIXErrorDomain 代码=1 "不允许操作"}} 2016-06-25 12:48:02.969 链 [4187:1957659] 插件 com.swiftkey.SwiftKeyApp.Keyboard 无效 可选([“public.image”,“public.movi​​e”]) 信息:[“UIImagePickerControllerOriginalImage”:尺寸 {1836, 1454} 方向 0 比例 1.000000,“UIImagePickerControllerReferenceURL”:资产库://asset/asset.JPG?id=5FE3480C-0A3E-42B2-B83B-93D0F321A3B2&ext=JPG,“UIImagePickerControllerMediaType ": public.image, "UIImagePickerControllerCropRect": NSRect: {{0, 0}, {1836, 1452}}, "UIImagePickerControllerEditedImage": 尺寸 {638, 504} 方向 0 比例 1.000000] fileToUploadURL:file:///var/mobile/Media/DCIM/100APPLE/IMG_0027.JPG 可选([“public.image”,“public.movi​​e”]) 2016-06-25 13:01:58.845 链 [4187:1958957] 插件 com.swiftkey.SwiftKeyApp.Keyboard 无效 info: ["UIImagePickerControllerOriginalImage": 尺寸 {1836, 1454} 方向 0 比例 1.000000, "UIImagePickerControllerReferenceURL": assets-library://asset/asset.JPG?id=CFF5692E-2B93-407D-A9E4-48AC1BEDCAF2&ext=JPG, "UIImagePickerControllerMediaType ": public.image, "UIImagePickerControllerCropRect": NSRect: {{0, 0}, {1836, 1452}}, "UIImagePickerControllerEditedImage": 尺寸 {638, 504} 方向 0 比例 1.000000] fileToUploadURL: 无

2016-06-25 13:04:05.136 Chain[4187:1957121] _BSMachError: (os/kern) 无效能力 (20) 2016-06-25 13:04:05.138 链 [4187:1959394] _BSMachError: (os/kern) 无效名称 (15) 2016-06-25 13:04:05.146 链 [4187:1959394] 插件 com.swiftkey.SwiftKeyApp.Keyboard 无效 2016-06-25 13:04:05.220 链 [4187:1957188​​] CFNetwork SSLHandshake 失败 (-9806) 2016-06-25 13:04:05.661 链 [4187:1957121] 正文文件无法访问:/var/mobile/Media/DCIM/100APPLE/IMG_0015.JPG Error Domain=NSCocoaErrorDomain Code=257 "无法打开文件“IMG_0015.JPG”,因为您没有查看权限。" UserInfo={NSURL=file:///var/mobile/Media/DCIM/100APPLE/IMG_0015.JPG, NSFilePath=/var/mobile/Media/DCIM/100APPLE/IMG_0015.JPG, NSUnderlyingError=0x18bd4330 {错误域=NSPOSIXErrorDomain 代码=1 "不允许操作"}}

编辑:这是我的 didFinishPickingMedia:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {


    let mediaType = info[UIImagePickerControllerMediaType] as! NSString

    print ("info: \(info)")

    if mediaType.isEqualToString(kUTTypeImage as String) {
        var newImage: UIImage

        if let possibleImage = info["UIImagePickerControllerEditedImage"] as? UIImage {
            newImage = possibleImage
        }
        else if let possibleImage = info["UIImagePickerControllerOriginalImage"] as? UIImage {
            newImage = possibleImage
        }

        else {
            return
        }

      /// CAN NOT GET NSURL working, NEED TO USE NSDATA
        if let jpegData:NSData = UIImageJPEGRepresentation(newImage, 80) {
            currentMediaTypeToUpload = "img"
            fileToUploadDATA = jpegData
        }

    }


    else if mediaType.isEqualToString(kUTTypeMovie as String) {
        let videoURL = info[UIImagePickerControllerMediaURL] as? NSURL

        fileToUploadURL = videoURL!
        currentMediaTypeToUpload = "vid"
    }

【问题讨论】:

    标签: ios firebase uiimagepickercontroller nsurl firebase-storage


    【解决方案1】:

    解决办法在这里:how do I get NSURL for an image froom UIImagePickerController? for upload to Firebase

    应用于我们的问题:

    if  let referenceUrl = info[UIImagePickerControllerReferenceURL] {
    
            ////
            let assetURL = NSURL(string: String(referenceUrl))
            let assets = PHAsset.fetchAssetsWithALAssetURLs([assetURL!], options: nil)
            let asset: PHAsset = assets.firstObject as! PHAsset
            let manager = PHImageManager.defaultManager()
            let requestSize =   PHImageManagerMaximumSize
            manager.requestImageForAsset(asset, targetSize: requestSize, contentMode: .AspectFit, options: nil, resultHandler: {(result, info)->Void in
                // Result is a UIImage
                // Either upload the UIImage directly or write it to a file
                let imageData = UIImageJPEGRepresentation(result!, 0.8)
                let imagePath = FIRAuth.auth()!.currentUser!.uid + "/\(Int(NSDate.timeIntervalSinceReferenceDate() * 1000)).jpg"
                print ("filePath: ", imagePath)
                let metadata = FIRStorageMetadata()
                metadata.contentType = "image/jpeg"
                self.storageRef.child(imagePath)
                    .putData(imageData!, metadata: metadata) { (metadata, error) in
                        if let error = error {
                            print("Error uploading: \(error.description)")
                            return
                        }
                        self.sendMessage([Constants.MessageFields.imageUrl: self.storageRef.child((metadata?.path)!).description])
                        print("Succeded")
                }
    
            })
        }
    

    有了这个解决方案,我可以将我的文件上传到 firebase。

    【讨论】:

    • 好吧..那很好。你能告诉我相机应该是什么吗??
    【解决方案2】:

    UIImagePickerControllers 返回的NSURLs 具有assets-library:// 的方案,文件系统 URL 库(包括我们的库)不能直接访问该方案。您必须通过Photos 框架来检索内容,然后将该数据写入单独的NSURL 或将其上传到内存中。

      let assetURL = NSURL(string: "assets-library://path/to/content")
      let assets = PHAsset.fetchAssetsWithALAssetURLs([assetURL!], options: nil)
      let asset: PHAsset = assets.firstObject as! PHAsset
    
      let manager = PHImageManager.defaultManager()
      manager.requestImageForAsset(asset, targetSize: CGSize(width: 100.0, height: 100.0), contentMode: .AspectFit, options: nil, resultHandler: {(result, info)->Void in
        // Result is a UIImage
        // Either upload the UIImage directly or write it to a file
      })
    

    此示例代码取自 here,作为我们 I/O 谈话 Zero to App: Develop with Firebase 的一部分。

    【讨论】:

      【解决方案3】:

      我不确定您究竟是如何尝试从 UIImagePickerController 实例中获取图像,但您可以实现委托并获取 UIImage 实例,然后使用“内存中”方法将其上传到 FirbaseStorage:

      func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
          guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else { return }
          guard let imageData = UIImageJPEGRepresentation(image, 1.0) else { return }
      
          let storageRef = FIRStorage.storage().referenceForURL("gs://project-id.appspot.com")
          imagesRef.putData(imageData, metadata: nil) { metadata, error in
              ...
          }
       }
      

      【讨论】:

      • 感谢 orxelm。我让它与 putData 函数一起工作。但仅出于知识目的,我也想为 URL 版本提供解决方案。我想知道它是 firebase 错误还是 ios 错误,或者我只是没有正确编写解决方案。
      猜你喜欢
      • 1970-01-01
      • 2012-04-08
      • 2018-11-10
      • 1970-01-01
      • 2017-11-24
      • 2020-06-26
      • 1970-01-01
      • 2021-10-12
      • 2018-04-25
      相关资源
      最近更新 更多