我有一個帶有文本欄位和影像選擇器的簡單表單,用戶可以將其上傳到 Firebase。
如何let @DocumentID = ...在存盤部分?
目的:我需要將影像保存為一個檔案中的鏈接。目前影像僅保存在Storage中。如何正確執行?
所有的嘗試都讓我發現它pic是在資料庫中創建為單獨的檔案,而不是在同一個檔案中。

按鈕:完成-[AddItemView]
@ObservedObject var viewModel = NewItemView()
func handleDoneTapped() {
self.viewModel.handleDoneTapped()
self.uploadImage()
self.dismiss()
}
存盤部分-[AddItemView]
@ObservedObject var viewModel = NewItemView()
func uploadImage() {
let storage = Storage.storage().reference()
let picData: Data = pickedImages[0].jpegData(compressionQuality: 0.5)!
// let userId = Auth.auth().currentUser?.uid
let path = "itemImages/\(UUID().uuidString).jpg"
let ref = storage.child(path)
let metadata = StorageMetadata()
metadata.contentType = "image/jpg"
let uploadTask = ref.putData(picData, metadata: metadata, completion: { (storageMetaData, error) in
if error != nil {
print(error?.localizedDescription as Any)
return
}
})
}
所有vars -[SingleItem]
struct SingleItem: Identifiable, Codable {
@DocumentID var id: String? // How I can use it in Storage section?
var title : String
var author : String
var description : String
@ServerTimestamp var createdTime: Timestamp?
var userId : String?
var pic : String
}
enum CodingKeys: String, CodingKey {
case id
case title
case author
case description = ""
case pic
}
Firestore -[NewItemView]
class NewItemView: ObservableObject {
// MARK: - Public properties
@Published var singleitem: SingleItem
@Published var modified = false
// MARK: - Internal properties
private var cancellables = Set<AnyCancellable>()
// MARK: - Constructors
init(singleitem: SingleItem = SingleItem(title: "", author: "", description: "", pic: "")) {
self.singleitem = singleitem
self.$singleitem
.dropFirst()
.sink { [weak self] singleitem in
self?.modified = true
}
.store(in: &self.cancellables)
}
// MARK: - Firestore
private var db = Firestore.firestore()
private func addItem(_ singleitem: SingleItem) {
do {
var addedItem = singleitem
addedItem.userId = Auth.auth().currentUser?.uid
_ = try db.collection("items").addDocument(from: addedItem)
}
catch {
print(error)
}
}
private func updateItem(_ singleitem: SingleItem) {
if let documentID = singleitem.id {
do {
try db.collection("items").document(documentID).setData(from: singleitem)
}
catch {
print(error)
}
}
}
private func updateOrAddItem() {
if singleitem.id != nil {
self.updateItem(self.singleitem)
}
else {
addItem(singleitem)
}
}
func handleDoneTapped() { // And this func I call in Done button
self.updateOrAddItem()
}
}
uj5u.com熱心網友回復:
你創建了你的pathin uploadImage。您只需要使用您靜態創建的路徑更新您的物件。
// You make the path to the image here
let path = "itemImages/\(UUID().uuidString).jpg"
您可以通過多種方式執行此操作,但您需要類似
func uploadImage() {
let storage = Storage.storage().reference()
let picData: Data = pickedImages[0].jpegData(compressionQuality: 0.5)!
let path = "itemImages/\(UUID().uuidString).jpg"
let ref = storage.child(path)
let metadata = StorageMetadata()
metadata.contentType = "image/jpg"
let uploadTask = ref.putData(picData, metadata: metadata, completion: { (storageMetaData, error) in
if error != nil {
print(error?.localizedDescription as Any)
return
} else {
// Upload succeeded with the path you added
// So set the pic variable to the path
self.viewModel.singleItem.pic = path
// Then update the item
self.viewModel.updateOrAddItem()
}
})
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/515428.html
標籤:Google Cloud Collective IOS迅速代码firebase-存储
