2

firebase ストレージからビデオをダウンロードしようとしています。私がやっている方法は、.downloadURLWithCompletion関数を使用することです。関数が実行されるたびに、このエラーが発生します

Error Domain=FIRStorageErrorDomain Code=-13010 "Object videos/video1.m4v
    
 does not exist." UserInfo={object=videos/video1.m4v
    
, bucket=**********.appspot.com, ResponseBody={
  "error": {
    "code": 404,
    "message": "Not Found"
  }
}, data=<7b0a2020 22657272 6f72223a 207b0a20 20202022 636f6465 223a2034 30342c0a 20202020 226d6573 73616765 223a2022 4e6f7420 466f756e 64220a20 207d0a7d>, NSLocalizedDescription=Object videos/video1.m4v
    
 does not exist., ResponseErrorDomain=com.google.HTTPStatus, ResponseErrorCode=404}

認証されていないアクセスを許可するように、firebase のストレージ設定を変更しました。ここに画像の説明を入力

ストレージ リンクが正しいことも確認しました。ここに画像の説明を入力

Firebase ストレージにアクセスするコードは次のとおりです。

import UIKit
import AVKit
import AVFoundation
import FirebaseStorage

class VideoViewController: UIViewController
{
    var videoUrl:NSURL!
    var storageRef:FIRStorageReference!
    
    override func viewDidLoad()
    {
        let storage = FIRStorage.storage()
        storageRef = storage.referenceForURL("gs://**********.appspot.com")
        let videosRef = storageRef.child("videos")
        let videoName = NSUserDefaults.standardUserDefaults().objectForKey("videoName") as! String
            
        videosRef.child(videoName).downloadURLWithCompletion { (URL, error) -> Void in
            if (error != nil)
            {
                print(error!)
            }
            else
            {
                self.videoUrl = URL
                
                do
                {
                    try self.playVideo()
                }
                catch
                {
                    print("Error")
                }

            }
        }
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

それで、直接リンクを使用してみましたが、うまくいきました!

override func viewDidLoad()
    {
        let storage = FIRStorage.storage()
        storageRef = "gs://*************.appspot.com"
        let videosRef = "videos"
        let videoName = NSUserDefaults.standardUserDefaults().objectForKey("videoName") as! String
        
        storage.referenceForURL("\(storageRef)/\(videosRef)/\(videoName)").downloadURLWithCompletion { (URL, error) in
            if (error != nil)
            {
                print(error!)
            }
            else
            {
                self.videoUrl = URL
                
                do
                {
                    try self.playVideo()
                }
                catch
                {
                    print("Error")
                }

            }
        }

もちろん、このようなものに直接リンクを使用することは、データを取得するための最良の方法ではありません。次に、それらを印刷して生成された 2 つのリンクを比較しました。最初のリンクを印刷した方法は次のとおりです。

var videoUrl:NSURL!
var storageRef:FIRStorageReference!
    
    override func viewDidLoad()
    {
        let storage = FIRStorage.storage()
        storageRef = storage.referenceForURL("gs://*********.appspot.com")
        let videosRef = storageRef.child("videos")
        let videoName = NSUserDefaults.standardUserDefaults().objectForKey("videoName") as! String
        print(videosRef.child(videoName))

そしてそれは印刷されました

gs://***********.appspot.com/videos/video1.m4v

そして2番目のリンク:

var videoUrl:NSURL!
var storageRef:String!
    
    override func viewDidLoad()
    {
        let storage = FIRStorage.storage()
        storageRef = "gs://***********.appspot.com"
        let videosRef = "videos"
        let videoName = NSUserDefaults.standardUserDefaults().objectForKey("videoName") as! String
        print("\(storageRef)/\(videosRef)/\(videoName)")

印刷したもの

gs://***********.appspot.com/videos/video1.m4v

さて、videoNameそれが正しいことを確認するために の値も印刷しようとしましたが、印刷するたびにvideo1.m4v

Firebase ストレージへのリンクを確認しましたが、リンクが全体的に正しいことを保証できます。

このエラーが発生する理由を誰かに説明してもらえますか? 私にはすべてが整っているように見えます。

ありがとう!

4

3 に答える 3

2

これを試してみてください -- 参照の基になる表現に問題がある場合、これが役立つかもしれません:

それ以外の:

    videosRef.child(videoName).downloadURLWithCompletion { (URL, error) -> Void in

行う:

    storage.referenceForURL(String(videosRef.child(videoName))).downloadURLWithCompletion { (URL, error) -> Void in

つまり、stringValue の referenceForURL は、直接呼び出しとは異なることを行いますか。そうすべきではありません -- もしそうなら、あなたの videoName に何か関係があるかもしれません。もしかしてスラッシュで終わる?videoName の値を投稿できますか?

于 2016-06-02T00:44:54.170 に答える
0

それで、私の理解が正しければ、完全な URL パスを渡さずに画像をダウンロードしたいですか?

downloadURLWithCompletionもしそうなら、完全な URL パスが必要だと思います。

データをこのように設定していないため、これをテストすることはできません (firebase ストレージ内のメディア ファイルへの完全な URL を firebase データベースに保存するだけです) が、これを試してください:

videosRef.child(videoName).dataWithMaxSize(INT64_MAX, completion: { (data, error) in
    if let error = error {
        print("Error downloading: \(error)")
        return
    }
    cell.imageView?.image = UIImage.init(data: data!)
})
于 2016-06-07T11:38:23.303 に答える