我正在使用 Firebase 存储上传文件。
https://firebase.google.com/docs/storage/web/upload-files#monitor_upload_progress
上传效果很好,但是 on("state_changed") 事件只被调用两次,所以我的进度条从 0% 跳到 100%。是否可以获得 0 到 100 之间的一些值?这对于用户来说将会是更好的体验。
背景:我正在使用 Firebase Cloud Functions、新的 Firestore 数据库和带有 Android 客户端的存储桶。
我想要完成的任务: 当用户将图片上传到存储桶时,我想使用云函数获取存储桶中图像位置的文件路径/链接,并将该字符串作为新文档存储在新集合下在 Firestore 中当前登录的用户文档下称为“图片”。
这样,我可以看到每个用户直接在 Firestore 中上传的图像,并且可以更轻松地将特定用户的图像拉至 Android 客户端。
到目前为止我已经完成的工作: 1. 当用户第一次登录时,它会在新的 Firestore 数据库中创建一个用户文档。2. 登录用户可以将图片上传到存储桶。3.使用Firebase Cloud Functions,我设法获取存储位置的文件路径/链接,如下所示:
/**
* When a user selects a profile picture on their device during onboarding,
* the image is sent to Firebase Storage from a function running on their device.
* The cloud function below returns the file path of the newly uploaded image.
*/
exports.getImageStorageLocationWhenUploaded = functions.storage.object().onFinalize((object) => {
const filePath = object.name; // …Run Code Online (Sandbox Code Playgroud)android firebase google-cloud-functions firebase-storage google-cloud-firestore
我目前正在构建一个应用程序,后端和前端,我使用 Firebase 来保存用户可以上传和下载的图片,到目前为止我一直在从前端上传它们,如果上传成功,那么我将带有其余数据的图像链接发送到后端,但是当我在应用程序中保存 firebase 凭据(以便连接)时,现在我怀疑在后端执行所有操作是否会更好/更安全,发送所有信息(包括图像)并让后端将图像上传到 firebase。我不知道应用程序的这些凭据有多安全
我是新手。我尝试使应用程序使用颤振上传一些图像。我已经成功地从图像选择器中选择了一些图像,但是当我尝试将数据写入 Firebase 存储时,只有一张图像成功上传。这是我的代码:
List<File> _imageList = [];
File _image;
Future uploadFile() async {
final FirebaseUser user = await FirebaseAuth.instance.currentUser();
final userId = user.uid;
final StorageReference firebaseStorageRef =
FirebaseStorage.instance.ref().child(userId).child('images');
final StorageUploadTask task = firebaseStorageRef.putFile(_image);
return task;
}
Run Code Online (Sandbox Code Playgroud)
这是我选择和显示图像的代码
Future getImageFromGallery() async {
var image = await ImagePicker.pickImage(source: ImageSource.gallery);
setState(() {
_image = image;
_imageList.add(_image);
});
}
List<Widget> builtImageDisplay() {
return [
Padding(
padding: const EdgeInsets.all(8.0),
child: new Center(
child: Padding(
padding: const EdgeInsets.all(15.0),
child: _imageList.length == 0
? new Image.asset('assets/images/format.jpg')
: …Run Code Online (Sandbox Code Playgroud) 我使用实时数据库来存储我的用户配置文件。
每个配置文件都可以包含多个房间,每个房间都包含自己的图片,从而创建了一个非常复杂的结构。
为了更容易地将图片存储到相应的配置文件和房间,我在将对象解析到数据库之前将 android 中的图片位图更改为字符串,然后当我取回对象时,我将字符串转换回位图。
我只是想知道这是否会在未来降低成本。或者如果这个实现是安全的,我们将更多的数据放在数据库中。
android firebase firebase-realtime-database firebase-storage
在 iOS 12 上完美运行。
简单的样板代码:
let storageRef = storage.reference().child("\(profile.studioCode)/\(selected.classId)/\(uploadDate)")
//Upload file and metadata
let uploadTask = storageRef.putFile(from: videoURL, metadata: metadata)
//Listen for state changes and, errors, and completion of the upload
uploadTask.observe(.resume) { (snapshot) in
//upload resumed or started
}
uploadTask.observe(.pause) { (snapshot) in
//upload paused
}
uploadTask.observe(.progress) { (snapshot) in
//upload progress
}
uploadTask.observe(.success) { (snapshot) in
//upload successful
}
uploadTask.observe(.failure) { (snapshot) in
//upload failed
}
Run Code Online (Sandbox Code Playgroud)
给我:
Error Domain=FIRStorageErrorDomain Code=-13000 "An unknown error occurred, please check the server …Run Code Online (Sandbox Code Playgroud) 所以我有一个使用nodeJS编写的firestore触发器函数,当firestore中的文档被删除时,我也想删除Firebase存储中存储的图像,存储中的文件名称与删除的文档ID相同。这是我的功能:
const functions = require('firebase-functions')
// initialize firestore database
const admin = require("../utilities/firebase_admin_init")
const db = admin.firestore()
const storage = admin.storage()
// firestore reference
const eventRef = db.collection('events')
exports.firestoreDeleteEventCleanUp = functions.firestore.document('events/{eventId}').onDelete((snapshot,context) => {
const eventID = context.params.eventId
// how to delete the image in firebase storage in here ????
})
Run Code Online (Sandbox Code Playgroud)
和管理员初始化
const admin = require("firebase-admin")
const functions = require('firebase-functions')
admin.initializeApp(functions.config().firebase)
module.exports = admin
Run Code Online (Sandbox Code Playgroud)
在Android中,我可以这样做来删除存储中的图像
// Create a storage reference from our app
val storageRef = storage.reference
// Create a reference …Run Code Online (Sandbox Code Playgroud) node.js google-cloud-storage firebase google-cloud-functions firebase-storage
就我而言,我有一个 Url 列表,我想从这些 url 下载每个文件并将其组织在 firebase 存储桶中,我的问题是我无法通过 nodejs javascript/typescript 在 firebase 存储桶中创建文件夹。
好吧,firebase storage 提供了 ref() 和 child 方法来上传子文件夹中的文件(请参阅this)但firebase只为firebase客户端库提供这些方法,并不是我们不能在nodejs中使用客户端库,而是他们隐藏了一些命名空间当您在 nodejs 中连接 firebase 客户端库并且存储是其中之一时(请参阅此)。
我很高兴他们分别考虑了前端和后端,因为前端和后端在安全性和用例方面有完全不同的场景,所以他们真正编写在 nodejs 中使用的是 firebase admin,我看不到 ref 和 child 方法在他们所说的官方文档中,这不是命名我正在上传的文件的任何其他方法,也不是任何使文件夹进入子目录的方法,当我从计算机上传文件时,它会以相同的名称保存在存储桶根目录中作为文件名,它在我的电脑中,即使我可以手动从 firebase 控制台创建文件夹,但它不能满足我的要求,肯定应该有任何方式以编程方式创建文件夹。
我也尝试使用 google 云存储库,const {Storage} = require('@google-cloud/storage');
但结果证明 firebase admin 和 gogole 云库共享相同的文档,并且至少在上传文件部分具有相同的界面。
好吧,我花了一整天的时间(因为是凌晨 4 点 46 分,所以晚上也是如此)尝试不同的库并深入研究他们的文档,我也发现这些文档几乎没有组织和缺乏代码示例。
任何帮助将不胜感激,到目前为止我的代码片段来自他们的文档并正确上传文件:
import "firebase/firestore"
admin.initializeApp({
credential: admin.credential.cert("./../path-to-service account-cert.json"),
databaseURL: 'gs://bilal-assistant-xxxxx.appspot.com'
});
const quran_bucket = admin.storage().bucket("quran-bucket");
quran_bucket.upload("./my_computer_path/fatiha.mp3", {
gzip: true,
metadata: {
cacheControl: 'public, …Run Code Online (Sandbox Code Playgroud) node.js google-cloud-storage firebase firebase-storage firebase-admin
我是 React.js 的新手,我正在尝试将图像上传到 Firebase 存储,成功上传后,我正在尝试同时将 downloadURL 推送到 Firestore。怎么做?这是上传图像工作正常但 firestore 不工作的代码。
import React, {useState, Component} from 'react';
import firebase from "../firebase";
const storage = firebase.storage();
class ImageUpload extends Component {
constructor(props) {
super(props);
this.state = {
image: null,
url: '',
progress: 0
}
this.handleChange = this
.handleChange
.bind(this);
this.handleUpload = this.handleUpload.bind(this);
}
handleChange = e => {
if (e.target.files[0]) {
const image = e.target.files[0];
this.setState(() => ({image}));
}
}
handleUpload = () => {
const {image} = this.state;
const uploadTask = …Run Code Online (Sandbox Code Playgroud) 我想将图像上传到 Firebase 存储,但我注意到大多数在线可用代码(文档除外)已弃用。因为我是 flutter 的新手,所以我阅读了图像选择器和 firestore 的文档。我能够找出图像选择器,但是在 firestore 桶中上传给我带来了困难。
下面是 imagepicker 的代码,我设法正确地做到了:
File _image;
final picker = ImagePicker();
Future getImage() async {
final pickedFile = await ImagePicker().getImage(source: ImageSource.camera);
setState(() {
if (pickedFile != null) {
_image = File(pickedFile.path);
} else {
print('No image selected.');
}
});
}
Run Code Online (Sandbox Code Playgroud)
现在我不知道如何完成上传到 Firebase 存储功能:
Future UploadImage(BuildContext context) async{
String filename = basename(_image.path);
firebase_storage.FirebaseStorage storage = firebase_storage.FirebaseStorage.instance;
// how to proceed?
}
Run Code Online (Sandbox Code Playgroud)