我試圖從我的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}
下面是訪問火力地堡存儲代碼:
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
我編組的鏈接到我的火力存儲,但我可以向你保證該鏈接是正確的。
有人可以向我解釋爲什麼我得到這個錯誤?對我來說,一切看起來都很到位。
謝謝!
一切看起來都對我很好 - 這就是爲什麼我感到困惑。 404意味着沒有找到該對象,這意味着該存儲桶是錯誤的(因爲它被空白了,我看不到它們是否匹配,但我假設它們是這樣做的),或者該文件以某種方式命名不正確。我偶爾會看到字符呈現相同的問題,但實際上是不同的unicode點(可能是這個時間段),這會導致它們成爲「不同的文件」,因此不存在。你可以用另一個文件重複這個問題嗎? –
@MikeMcDonald Ive嘗試使用不同的文件下載它,它具有相同的結果;然而,我發現,如果我要使用storage.referenceForURL(「\(storageRef)/ \(videosRef)/ \(videoName)」)函數進行直接鏈接(以及進行一些其他更改,例如更改所有這些變量到字符串)然後它的工作,所以問題必須與我如何創建鏈接。唯一錯誤的是,當我打印videosRef.child(videoName)的值與我之前展示的直接相同時。 – pjtnt11
你可以試試'讓videosRef2 = videosRef.child(videoName)',然後使用'videosRef2.downloadURLWithCompletion'代替。我知道這聽起來很愚蠢,但這種情況已經看起來很奇怪 – Chris