Swift 3 Firebase存储 - 无法上传
问题描述:
我正尝试将UIImage文件上传到firebase存储。我正在努力弄清楚为什么上传没有完成,即使在调试时也是如此。Swift 3 Firebase存储 - 无法上传
我创建了一个Firebase应用并将存储规则设置为可公开访问。
var storageRef = FIRStorage.storage().reference().child("images/TestImage.png")
然后在上传方法(其中meal.photo是一个UIImage)::
存储引用在性质如下所定义
let uploadData = UIImagePNGRepresentation(meal.photo!)
let uploadTask = storageRef.put(uploadData!,metadata: nil){ metadata, error in
if (error != nil) {
// Uh-oh, an error occurred!
} else {
// Metadata contains file metadata such as size, content-type, and download URL.
let downloadURL = metadata!.downloadURL
}
}
我没有收到任何构建/运行时错误,我已确认uploadData包含我希望上传的文件。但是,运行此方法没有任何事情发生。有任何想法吗?
编辑 我已经包含下面的参考整个片段:
@IBAction func unwindToMealList(_ sender: UIStoryboardSegue) {
if let sourceViewController = sender.source as? MealViewController, let meal = sourceViewController.meal {
if let selectedIndexPath = tableView.indexPathForSelectedRow {
// Update an existing meal.
meals[(selectedIndexPath as NSIndexPath).row] = meal
tableView.reloadRows(at: [selectedIndexPath], with: .none)
} else {
// Add a new meal.
let newIndexPath = IndexPath(row: meals.count, section: 0)
meals.append(meal)
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy"
let stringDate = dateFormatter.string(from: meal.date!)
let mealItem = ["name": meal.name, "date": stringDate, "mealType": meal.mealType] as [String : Any]
tableView.insertRows(at: [newIndexPath], with: .bottom)
// Add meal to firebase database
let mealRef = ref.child("meals")
mealRef.setValue(mealItem)
// Upload photo
// let imagesRef = storageRef.child("images")
let uploadData = UIImagePNGRepresentation(meal.photo!)
let uploadTask = storageRef.put(uploadData!,metadata: nil){ metadata, error in
if (error != nil) {
// Uh-oh, an error occurred!
} else {
// Metadata contains file metadata such as size, content-type, and download URL.
let downloadURL = metadata!.downloadURL
print(downloadURL)
}
}
}
// Save the meals.
saveMeals()
}
}
答
试试这个,我想你把saveMeals()函数来早,所以,上传方法不叫...
@IBAction func unwindToMealList(_ sender: UIStoryboardSegue) {
if let sourceViewController = sender.source as? MealViewController, let meal = sourceViewController.meal {
if let selectedIndexPath = tableView.indexPathForSelectedRow {
// Update an existing meal.
meals[(selectedIndexPath as NSIndexPath).row] = meal
tableView.reloadRows(at: [selectedIndexPath], with: .none)
} else {
// Add a new meal.
let newIndexPath = IndexPath(row: meals.count, section: 0)
meals.append(meal)
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy"
let stringDate = dateFormatter.string(from: meal.date!)
let mealItem = ["name": meal.name, "date": stringDate, "mealType": meal.mealType] as [String : Any]
tableView.insertRows(at: [newIndexPath], with: .bottom)
// Add meal to firebase database
let mealRef = ref.child("meals")
mealRef.setValue(mealItem)
// Upload photo
// let imagesRef = storageRef.child("images")
let uploadData = UIImagePNGRepresentation(meal.photo!)
let uploadTask = storageRef.put(uploadData!,metadata: nil){ metadata, error in
if (error != nil) {
// Uh-oh, an error occurred!
} else {
// Metadata contains file metadata such as size, content-type, and download URL.
let downloadURL = metadata!.downloadURL
print(downloadURL)
// New code, put your saveMeals function here.
self.saveMeals()
}
}
}
// Old code, please remove this saveMeals function.
// Save the meals.
saveMeals()
}
}
的代码看起来是正确的。你有没有下载URL?没有错误或任何其他信息,调试几乎是不可能的。 –
谢谢@MikeMcDonald。不,我没有得到一个downloadURL,代码似乎没有进入上传方法。我可以添加哪些其他信息可以帮助调试?道歉,对此很新颖。 – benjanisa
你可以在它所在的地方添加一行'print(error)',或者在那里添加一个断点并确认没有错误?除非上传从未被调用过(或者你已经离线了足够长的时间),否则我不能相信这些选项都不会触发。 –