2

人々がこれに問題を抱えているため、他のいくつかのスレッドが開始されました。このような: UIImagePickerController から NSURL を取得し、これ: Firebase ストレージのアップロードはシミュレーターでは機能しますが、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 チェーン[4187:1957121] 本文ファイルに到達できません: /var/mobile/Media/DCIM/100APPLE/IMG_0027.JPG エラー 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 無効化 Optional(["public.image", "public.movi​​e"]) info: ["UIImagePickerControllerOriginalImage": サイズ {1836, 1454} 向き 0 スケール 1.000000, "UIImagePickerControllerReferenceURL": assets-library://asset/asset.

2016-06-25 13:04:05.136 Chain[4187:1957121] _BSMachError: (os/kern) 無効な機能 (20) 2016-06-25 13:04:05.138 Chain[4187:1959394] _BSMachError: (os/kern ) 無効な名前 (15) 2016-06-25 13:04:05.146 Chain[4187:1959394] プラグイン com.swiftkey.SwiftKeyApp.Keyboard 無効化 2016-06-25 13:04:05.220 Chain[4187:1957188​​] CFNetwork SSLHandshake 失敗(-9806) 2016-06-25 13:04:05.661 Chain[4187:1957121] 本文ファイルに到達できません: /var/mobile/Media/DCIM/100APPLE/IMG_0015.JPG エラー 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"
    }
4

3 に答える 3

3

解決策は次のとおりです: UIImagePickerControllerから画像のNSURLを取得するにはどうすればよいですか? 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にアップロードできました。

于 2016-06-30T21:51:32.687 に答える
1

NSURLs から返されたUIImagePickerControllers には schemeassets-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
  })

このサンプル コードは、I/O トークZero to App: Develop with Firebaseの一部として、 hereから取得しました。

于 2016-06-26T02:57:58.157 に答える
0

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
        ...
    }
 }
于 2016-06-25T19:43:59.190 に答える