2016-05-30 10 views
2

firebase storageからビデオをダウンロードしようとしています。私がやっているやり方は、.downloadURLWithCompletion機能を使うことです。関数が実行今まで、私は私が認証されていないアクセスできるようにfirebaseに私のストレージ設定を変更した。このエラー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} 

を受け取った場合:enter image description here

を私はまた、ストレージのリンクが正しいことを確認するためにチェックしていますenter image description hereここで

が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. 
    } 

を、私はUSIを試してみました直リンクにして機能しました!もちろん

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

さて、私もそれが正しかったと私はそれをプリントアウトするたびに、それはvideo1.m4v

は私firebaseストレージへのリンクをバンクだったことを確認するvideoNameの値を印刷しようとしたが、私はあなたを確保することができますリンクがまったく正しいこと。

なぜこのエラーが発生するのですか?私にとっては、すべてが正しいと思われます。

ありがとうございます!

+0

私にもすべてが正しいように見えるので、私は困惑しています。 404は、オブジェクトが見つからないことを意味します。つまり、バケツが間違っている(空白になっているか、一致するかどうかはわかりませんが、ファイルがあると見なします)か、ファイルの名前が間違っています。私はときどき文字が同じようにレンダリングされる問題を見たことがありますが、実際には異なったUnicodeポイント(期間が多分かもしれません)が「異なるファイル」になるため存在しません。別のファイルでこの問題を繰り返すことはできますか? –

+0

@MikeMcDonald Iveは別のファイルを使用してダウンロードしようとしましたが、同じ結果が出ました。しかし、storage.referenceForURL( "\(storageRef)/ \(videosRef)/ \(videoName)")関数を使ってダイレクトリンクを行う場合は、これらの変数をすべて変更する文字列に変換する)、それがうまくいくので、問題はリンクをどのように作成しているのかと関係があります。それが間違っているのは、先に示したように、videosRef.child(videoName)の値を直接の値と同じに出力するときだけです。 – pjtnt11

+0

あなたは 'let videosRef2 = videosRef.child(videoName)'を試してから、代わりに 'videosRef2.downloadURLWithCompletion'を使うことができます。私はそれが愚かに聞こえることを知っているが、この場合はすでにかなり奇妙に見える – Chris

答えて

2

はこれを試してみてください - REFの基礎となる表現に問題がある場合、これが役立つことがあります。

の代わりに:

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

行います

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

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

+0

それで、あなたが提案したことをやってみたところ、(videoRef.child(videoName)を文字列に変換して)驚くほどうまくいっていました。それはより近いですが、私が探しているものではありません。私はビデオ名の価値を印刷し、それはvideo1.m4vです。まだそれは動作するように見えます。 – pjtnt11

0

私が正しく理解していれば、完全なURLパスを渡さずにイメージをダウンロードしたいのですか?

もしそうなら、downloadURLWithCompletionに完全なURLパスが必要です。

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

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!) 
}) 
+0

助けてくれてありがとうが、これはうまくいかない。私はイメージをダウンロードしようとしているだけでなく(ダウンロードしようとしているビデオです)、URLからビデオを再生するためのシステムも用意されています。 – pjtnt11

0

firebaseのストレージでは、ビデオファイルをビデオというフォルダの中に入れていません。

これにも関わらず.../ビデオ /ファイル名が存在しません。どちらの//***********.appspot.com /動画 /video1.m4v

または

というフォルダを作成します:GS:から/動画を削除しようとするのいずれかfirebase storage内の動画を削除してから、同じ名前の同じ動画を他のフォルダにドラッグ&ドロップすることはできません。 あなたのパスからvideosRef = "videos" を削除してください。

希望します。