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

            }
        }

当然,对这样的事情使用直接链接并不是获取数据的最佳方式。所以接下来我比较了打印出来的两个链接。这是我打印第一个链接的方式:

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

我将指向我的 firebase 存储的链接存入银行,但我可以向您保证,该链接在所有地方都是正确的。

有人可以向我解释为什么我会收到此错误吗?对我来说,一切看起来都已经到位。

谢谢!

4

3 回答 3

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 的值吗?

于 2016-06-02T00:44:54.170 回答
0

在您的 Firebase 存储中,您尚未将视频文件放在名为 videos 的文件夹中。

尽管如此,您仍尝试访问不存在的.../视频/文件名。尝试从以下位置删除 /videos:gs://***********.appspot.com /videos /video1.m4v

或者

在您的 Firebase 存储中创建一个名为 videos 的文件夹,然后在其中添加具有相同名称的相同视频(因为您无法将文件拖放到其他文件夹中),或者从您的路径中删除:let videosRef = "videos"。

希望能帮助到你。

于 2017-03-19T10:10:04.883 回答
0

那么,如果我理解正确,您想在不传递完整 URL 路径的情况下下载图像吗?

如果是这样,我认为downloadURLWithCompletion需要完整的 URL 路径。

我无法对此进行测试,因为我没有以这种方式设置数据(我只是将媒体文件的完整 URL 存储到 firebase 存储到我的 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 回答