2016-05-30 114 views
2

我試圖從我的Firebase存儲下載視頻。我這樣做的方式是使用.downloadURLWithCompletion函數。曾經在函數執行的時候,我收到此錯誤Firebase downloadURL完成錯誤

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

下面是訪問火力地堡存儲代碼:

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") 
       } 

      } 
     } 

當然,使用這樣的直接鏈接並不完全是獲取數據的最佳方式。接下來我比較了將這兩個鏈接打印出來的情況。這裏是我打印的第一環節:

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

和第二鏈接:

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

我編組的鏈接到我的火力存儲,但我可以向你保證該鏈接是正確的。

有人可以向我解釋爲什麼我得到這個錯誤?對我來說,一切看起來都很到位。

謝謝!

+0

一切看起來都對我很好 - 這就是爲什麼我感到困惑。 404意味着沒有找到該對象,這意味着該存儲桶是錯誤的(因爲它被空白了,我看不到它們是否匹配,但我假設它們是這樣做的),或者該文件以某種方式命名不正確。我偶爾會看到字符呈現相同的問題,但實際上是不同的unicode點(可能是這個時間段),這會導致它們成爲「不同的文件」,因此不存在。你可以用另一個文件重複這個問題嗎? –

+0

@MikeMcDonald Ive嘗試使用不同的文件下載它,它具有相同的結果;然而,我發現,如果我要使用storage.referenceForURL(「\(storageRef)/ \(videosRef)/ \(videoName)」)函數進行直接鏈接(以及進行一些其他更改,例如更改所有這些變量到字符串)然後它的工作,所以問題必須與我如何創建鏈接。唯一錯誤的是,當我打印videosRef.child(videoName)的值與我之前展示的直接相同時。 – pjtnt11

+0

你可以試試'讓videosRef2 = videosRef.child(videoName)',然後使用'videosRef2.downloadURLWithCompletion'代替。我知道這聽起來很愚蠢,但這種情況已經看起來很奇怪 – Chris

回答

2

試試這個 - 如果有問題與裁判的基本表示,這可能幫助:的

代替:

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

做:

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

也就是說, stringValue的referenceForURL做的事情與直接調用不同。它不應該 - 如果是這樣,它可能與你的videoName有關。也許它以斜線結束?你可以發佈你的videoName的價值嗎?

+0

好的,所以我試着做你的建議,它令人驚訝地工作(將videosRef.child(videoName)翻譯成字符串後)。這是更接近,但仍然不是我所期待的。我打印出視頻名稱的值,它是video1.m4v。仍然看起來應該工作。 – pjtnt11

0

所以,如果我理解正確,你想下載圖像,而不通過完整的URL路徑?

如果是這樣,我認爲downloadURLWithCompletion需要完整的URL路徑。

我不能對此進行測試,因爲我在我的數據設置這樣(我只是完整的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存儲中,您尚未將視頻文件放在名爲視頻的文件夾中。

儘管如此,您仍嘗試訪問.../視頻 /文件名不存在。無論是嘗試從刪除/視頻:GS://***********.appspot.com /視頻 /video1.m4v

可以創建稱爲文件夾您的Firebase存儲空間中的視頻,然後添加相同的視頻與它相同的名稱(因爲你不能將文件拖放到其他文件夾),或從您的路徑中刪除: 讓videosRef =「videos」 。

希望它有幫助。