Cloud Storage for Firebase cho phép bạn tải tệp lên một bộ chứa Cloud Storage do Firebase cung cấp và quản lý một cách nhanh chóng và dễ dàng.
Tải tệp lên
Để tải tệp lên Cloud Storage, trước tiên, bạn cần tạo một tệp tham chiếu đến đường dẫn đầy đủ của tệp, bao gồm cả tên tệp.
Web
import { getStorage, ref } from "firebase/storage"; // Create a root reference const storage = getStorage(); // Create a reference to 'mountains.jpg' const mountainsRef = ref(storage, 'mountains.jpg'); // Create a reference to 'images/mountains.jpg' const mountainImagesRef = ref(storage, 'images/mountains.jpg'); // While the file names are the same, the references point to different files mountainsRef.name === mountainImagesRef.name; // true mountainsRef.fullPath === mountainImagesRef.fullPath; // false
Web
// Create a root reference var storageRef = firebase.storage().ref(); // Create a reference to 'mountains.jpg' var mountainsRef = storageRef.child('mountains.jpg'); // Create a reference to 'images/mountains.jpg' var mountainImagesRef = storageRef.child('images/mountains.jpg'); // While the file names are the same, the references point to different files mountainsRef.name === mountainImagesRef.name; // true mountainsRef.fullPath === mountainImagesRef.fullPath; // false
Tải lên từ Blob
hoặc File
Sau khi tạo một tệp tham chiếu thích hợp, bạn sẽ gọi phương thức uploadBytes()
. uploadBytes()
lấy các tệp thông qua API Tệp và Blob của JavaScript, sau đó tải các tệp đó lên Cloud Storage.
Web
import { getStorage, ref, uploadBytes } from "firebase/storage"; const storage = getStorage(); const storageRef = ref(storage, 'some-child'); // 'file' comes from the Blob or File API uploadBytes(storageRef, file).then((snapshot) => { console.log('Uploaded a blob or file!'); });
Web
// 'file' comes from the Blob or File API ref.put(file).then((snapshot) => { console.log('Uploaded a blob or file!'); });
Tải lên từ Mảng byte
Ngoài các loại File
và Blob
, uploadBytes()
cũng có thể tải Uint8Array
lên Cloud Storage.
Web
import { getStorage, ref, uploadBytes } from "firebase/storage"; const storage = getStorage(); const storageRef = ref(storage, 'some-child'); const bytes = new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21]); uploadBytes(storageRef, bytes).then((snapshot) => { console.log('Uploaded an array!'); });
Web
var bytes = new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21]); ref.put(bytes).then((snapshot) => { console.log('Uploaded an array!'); });
Tải lên từ Chuỗi
Nếu không có Blob
, File
hoặc Uint8Array
, bạn có thể sử dụng phương thức uploadString()
để tải một chuỗi thô, base64
, base64url
hoặc data_url
đã mã hoá lên Cloud Storage.
Web
import { getStorage, ref, uploadString } from "firebase/storage"; const storage = getStorage(); const storageRef = ref(storage, 'some-child'); // Raw string is the default if no format is provided const message = 'This is my message.'; uploadString(storageRef, message).then((snapshot) => { console.log('Uploaded a raw string!'); }); // Base64 formatted string const message2 = '5b6p5Y+344GX44G+44GX44Gf77yB44GK44KB44Gn44Go44GG77yB'; uploadString(storageRef, message2, 'base64').then((snapshot) => { console.log('Uploaded a base64 string!'); }); // Base64url formatted string const message3 = '5b6p5Y-344GX44G-44GX44Gf77yB44GK44KB44Gn44Go44GG77yB'; uploadString(storageRef, message3, 'base64url').then((snapshot) => { console.log('Uploaded a base64url string!'); }); // Data URL string const message4 = 'data:text/plain;base64,5b6p5Y+344GX44G+44GX44Gf77yB44GK44KB44Gn44Go44GG77yB'; uploadString(storageRef, message4, 'data_url').then((snapshot) => { console.log('Uploaded a data_url string!'); });
Web
// Raw string is the default if no format is provided var message = 'This is my message.'; ref.putString(message).then((snapshot) => { console.log('Uploaded a raw string!'); }); // Base64 formatted string var message = '5b6p5Y+344GX44G+44GX44Gf77yB44GK44KB44Gn44Go44GG77yB'; ref.putString(message, 'base64').then((snapshot) => { console.log('Uploaded a base64 string!'); }); // Base64url formatted string var message = '5b6p5Y-344GX44G-44GX44Gf77yB44GK44KB44Gn44Go44GG77yB'; ref.putString(message, 'base64url').then((snapshot) => { console.log('Uploaded a base64url string!'); }); // Data URL string var message = 'data:text/plain;base64,5b6p5Y+344GX44G+44GX44Gf77yB44GK44KB44Gn44Go44GG77yB'; ref.putString(message, 'data_url').then((snapshot) => { console.log('Uploaded a data_url string!'); });
Vì tệp tham chiếu xác định đường dẫn đầy đủ đến tệp, hãy đảm bảo rằng bạn đang tải lên một đường dẫn không trống.
Thêm siêu dữ liệu tệp
Khi tải tệp lên, bạn cũng có thể chỉ định siêu dữ liệu cho tệp đó.
Siêu dữ liệu này chứa các thuộc tính siêu dữ liệu tệp thông thường như name
, size
và contentType
(thường được gọi là loại MIME). Cloud Storage tự động suy luận loại nội dung từ đuôi tệp nơi tệp được lưu trữ trên ổ đĩa, nhưng nếu bạn chỉ định contentType
trong siêu dữ liệu, thì loại này sẽ ghi đè loại được phát hiện tự động. Nếu không chỉ định siêu dữ liệu contentType
và tệp không có đuôi tệp, thì Cloud Storage sẽ mặc định là loại application/octet-stream
. Bạn có thể xem thêm thông tin về siêu dữ liệu tệp trong phần Sử dụng siêu dữ liệu tệp.
Web
import { getStorage, ref, uploadBytes } from "firebase/storage"; const storage = getStorage(); const storageRef = ref(storage, 'images/mountains.jpg'); // Create file metadata including the content type /** @type {any} */ const metadata = { contentType: 'image/jpeg', }; // Upload the file and metadata const uploadTask = uploadBytes(storageRef, file, metadata);
Web
// Create file metadata including the content type var metadata = { contentType: 'image/jpeg', }; // Upload the file and metadata var uploadTask = storageRef.child('images/mountains.jpg').put(file, metadata);
Quản lý tải lên
Ngoài việc bắt đầu tải lên, bạn có thể tạm dừng, tiếp tục và huỷ tải lên bằng các phương thức pause()
, resume()
và cancel()
. Việc gọi pause()
hoặc resume()
sẽ làm thay đổi trạng thái pause
hoặc running
. Việc gọi phương thức cancel()
sẽ khiến quá trình tải lên không thành công và trả về lỗi cho biết quá trình tải lên đã bị huỷ.
Web
import { getStorage, ref, uploadBytesResumable } from "firebase/storage"; const storage = getStorage(); const storageRef = ref(storage, 'images/mountains.jpg'); // Upload the file and metadata const uploadTask = uploadBytesResumable(storageRef, file); // Pause the upload uploadTask.pause(); // Resume the upload uploadTask.resume(); // Cancel the upload uploadTask.cancel();
Web
// Upload the file and metadata var uploadTask = storageRef.child('images/mountains.jpg').put(file); // Pause the upload uploadTask.pause(); // Resume the upload uploadTask.resume(); // Cancel the upload uploadTask.cancel();
Theo dõi tiến trình tải lên
Trong khi tải lên, tác vụ tải lên có thể tạo ra các sự kiện tiến trình trong trình quan sát state_changed
, chẳng hạn như:
Loại sự kiện | Cách sử dụng thông thường |
---|---|
running |
Sự kiện này kích hoạt khi tác vụ bắt đầu hoặc tiếp tục tải lên và thường được dùng kết hợp với sự kiện pause . Đối với các tệp tải lên lớn hơn, sự kiện này có thể kích hoạt nhiều lần dưới dạng thông tin cập nhật tiến trình. |
pause |
Sự kiện này kích hoạt bất cứ khi nào quá trình tải lên bị tạm dừng và thường được sử dụng cùng với sự kiện running . |
Khi một sự kiện xảy ra, đối tượng TaskSnapshot
sẽ được chuyển lại. Ảnh chụp nhanh này là một chế độ xem không thể thay đổi của tác vụ tại thời điểm sự kiện xảy ra.
Đối tượng này chứa các thuộc tính sau:
Tài sản | Loại | Mô tả |
---|---|---|
bytesTransferred |
Number |
Tổng số byte đã được chuyển khi chụp ảnh nhanh này. |
totalBytes |
Number |
Tổng số byte dự kiến sẽ được tải lên. |
state |
firebase.storage.TaskState |
Trạng thái hiện tại của quá trình tải lên. |
metadata |
firebaseStorage.Metadata |
Trước khi quá trình tải lên hoàn tất, siêu dữ liệu sẽ được gửi đến máy chủ. Sau khi tải lên xong, siêu dữ liệu mà máy chủ gửi lại. |
task |
firebaseStorage.UploadTask |
Tác vụ này là một bản tổng quan nhanh, có thể dùng để `tạm dừng`, `tiếp tục` hoặc `huỷ` tác vụ. |
ref |
firebaseStorage.Reference |
Tham chiếu của tác vụ này. |
Những thay đổi về trạng thái này, kết hợp với các thuộc tính của TaskSnapshot
, mang đến một cách đơn giản nhưng hiệu quả để theo dõi các sự kiện tải lên.
Web
import { getStorage, ref, uploadBytesResumable, getDownloadURL } from "firebase/storage"; const storage = getStorage(); const storageRef = ref(storage, 'images/rivers.jpg'); const uploadTask = uploadBytesResumable(storageRef, file); // Register three observers: // 1. 'state_changed' observer, called any time the state changes // 2. Error observer, called on failure // 3. Completion observer, called on successful completion uploadTask.on('state_changed', (snapshot) => { // Observe state change events such as progress, pause, and resume // Get task progress, including the number of bytes uploaded and the total number of bytes to be uploaded const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100; console.log('Upload is ' + progress + '% done'); switch (snapshot.state) { case 'paused': console.log('Upload is paused'); break; case 'running': console.log('Upload is running'); break; } }, (error) => { // Handle unsuccessful uploads }, () => { // Handle successful uploads on complete // For instance, get the download URL: https://firebasestorage.googleapis.com/... getDownloadURL(uploadTask.snapshot.ref).then((downloadURL) => { console.log('File available at', downloadURL); }); } );
Web
var uploadTask = storageRef.child('images/rivers.jpg').put(file); // Register three observers: // 1. 'state_changed' observer, called any time the state changes // 2. Error observer, called on failure // 3. Completion observer, called on successful completion uploadTask.on('state_changed', (snapshot) => { // Observe state change events such as progress, pause, and resume // Get task progress, including the number of bytes uploaded and the total number of bytes to be uploaded var progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100; console.log('Upload is ' + progress + '% done'); switch (snapshot.state) { case firebase.storage.TaskState.PAUSED: // or 'paused' console.log('Upload is paused'); break; case firebase.storage.TaskState.RUNNING: // or 'running' console.log('Upload is running'); break; } }, (error) => { // Handle unsuccessful uploads }, () => { // Handle successful uploads on complete // For instance, get the download URL: https://firebasestorage.googleapis.com/... uploadTask.snapshot.ref.getDownloadURL().then((downloadURL) => { console.log('File available at', downloadURL); }); } );
Lỗi xử lý
Có một số lý do khiến lỗi có thể xảy ra khi tải lên, bao gồm cả việc tệp cục bộ không tồn tại hoặc người dùng không có quyền tải tệp mong muốn lên. Bạn có thể xem thêm thông tin về lỗi trong phần Xử lý lỗi của tài liệu.
Ví dụ đầy đủ
Dưới đây là ví dụ đầy đủ về một lượt tải lên có tính năng theo dõi tiến trình và xử lý lỗi:
Web
import { getStorage, ref, uploadBytesResumable, getDownloadURL } from "firebase/storage"; const storage = getStorage(); // Create the file metadata /** @type {any} */ const metadata = { contentType: 'image/jpeg' }; // Upload file and metadata to the object 'images/mountains.jpg' const storageRef = ref(storage, 'images/' + file.name); const uploadTask = uploadBytesResumable(storageRef, file, metadata); // Listen for state changes, errors, and completion of the upload. uploadTask.on('state_changed', (snapshot) => { // Get task progress, including the number of bytes uploaded and the total number of bytes to be uploaded const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100; console.log('Upload is ' + progress + '% done'); switch (snapshot.state) { case 'paused': console.log('Upload is paused'); break; case 'running': console.log('Upload is running'); break; } }, (error) => { // A full list of error codes is available at // https://firebase.google.com/docs/storage/web/handle-errors switch (error.code) { case 'storage/unauthorized': // User doesn't have permission to access the object break; case 'storage/canceled': // User canceled the upload break; // ... case 'storage/unknown': // Unknown error occurred, inspect error.serverResponse break; } }, () => { // Upload completed successfully, now we can get the download URL getDownloadURL(uploadTask.snapshot.ref).then((downloadURL) => { console.log('File available at', downloadURL); }); } );
Web
// Create the file metadata var metadata = { contentType: 'image/jpeg' }; // Upload file and metadata to the object 'images/mountains.jpg' var uploadTask = storageRef.child('images/' + file.name).put(file, metadata); // Listen for state changes, errors, and completion of the upload. uploadTask.on(firebase.storage.TaskEvent.STATE_CHANGED, // or 'state_changed' (snapshot) => { // Get task progress, including the number of bytes uploaded and the total number of bytes to be uploaded var progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100; console.log('Upload is ' + progress + '% done'); switch (snapshot.state) { case firebase.storage.TaskState.PAUSED: // or 'paused' console.log('Upload is paused'); break; case firebase.storage.TaskState.RUNNING: // or 'running' console.log('Upload is running'); break; } }, (error) => { // A full list of error codes is available at // https://firebase.google.com/docs/storage/web/handle-errors switch (error.code) { case 'storage/unauthorized': // User doesn't have permission to access the object break; case 'storage/canceled': // User canceled the upload break; // ... case 'storage/unknown': // Unknown error occurred, inspect error.serverResponse break; } }, () => { // Upload completed successfully, now we can get the download URL uploadTask.snapshot.ref.getDownloadURL().then((downloadURL) => { console.log('File available at', downloadURL); }); } );
Giờ thì bạn đã tải các tệp lên, hãy tìm hiểu cách tải các tệp đó xuống từ Cloud Storage.