2016-05-30 58 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” 。

希望它有帮助。