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}
を私はまた、ストレージのリンクが正しいことを確認するためにチェックしていますここで
が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
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
の値を印刷しようとしたが、私はあなたを確保することができますリンクがまったく正しいこと。
なぜこのエラーが発生するのですか?私にとっては、すべてが正しいと思われます。
ありがとうございます!
私にもすべてが正しいように見えるので、私は困惑しています。 404は、オブジェクトが見つからないことを意味します。つまり、バケツが間違っている(空白になっているか、一致するかどうかはわかりませんが、ファイルがあると見なします)か、ファイルの名前が間違っています。私はときどき文字が同じようにレンダリングされる問題を見たことがありますが、実際には異なったUnicodeポイント(期間が多分かもしれません)が「異なるファイル」になるため存在しません。別のファイルでこの問題を繰り返すことはできますか? –
@MikeMcDonald Iveは別のファイルを使用してダウンロードしようとしましたが、同じ結果が出ました。しかし、storage.referenceForURL( "\(storageRef)/ \(videosRef)/ \(videoName)")関数を使ってダイレクトリンクを行う場合は、これらの変数をすべて変更する文字列に変換する)、それがうまくいくので、問題はリンクをどのように作成しているのかと関係があります。それが間違っているのは、先に示したように、videosRef.child(videoName)の値を直接の値と同じに出力するときだけです。 – pjtnt11
あなたは 'let videosRef2 = videosRef.child(videoName)'を試してから、代わりに 'videosRef2.downloadURLWithCompletion'を使うことができます。私はそれが愚かに聞こえることを知っているが、この場合はすでにかなり奇妙に見える – Chris