Cloud Storage for Firebase cho phép bạn nhanh chóng và dễ dàng tải tệp lên một bộ chứa Cloud Storage do Firebase cung cấp và quản lý.
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 tệp đối chiếu thích hợp, bạn hãy gọi uploadBytes()
. uploadBytes()
lấy tệp qua JavaScript
Tệp và
Các API và tệp tải lên của Blob
chúng vào 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 lên
Uint8Array
đế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ừ một chuỗi
Nếu không có Blob
, File
hoặc Uint8Array
, bạn có thể sử dụng
uploadString()
để tải một tệp thô, base64
, base64url
hoặc data_url
lên
chuỗi mã hoá thành 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!'); });
Do tham chiếu xác định đường dẫn đầy đủ đến tệp, hãy đảm bảo bạn việc 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 một 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 của tệp điển hình 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 bạn không chỉ định siêu dữ liệu contentType
và
tệp không có đuôi tệp, Cloud Storage mặc định là đuôi tệp
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()
. Gọi pause()
hoặc
resume()
sẽ áp dụng các thay đổi về trạng thái pause
hoặc running
. Gọi
Phương thức cancel()
dẫn đến việc tải lên không thành công và trả về một lỗi
cho biết rằng 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, nhiệm vụ tải lên có thể tăng các sự kiện tiến trình trong
đối tượng tiếp nhận dữ liệu 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 sử dụng kết hợp với sự kiện pause . Lớn hơn
hoặc sự kiện này có thể kích hoạt nhiều lần dưới dạng 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 dùng trong
kết hợp với sự kiện running . |
Khi một sự kiện xảy ra, đối tượng TaskSnapshot
sẽ được trả về. Thông tin tổng quan nhanh này
là khung hiển thị bất biến 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 quá trình này đã được chụp. |
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 tệp 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 thì siêu dữ liệu mà máy chủ gửi lại. |
task |
firebaseStorage.UploadTask |
Công việc là thông tin tổng quan nhanh, có thể dùng để "tạm dừng", "tiếp tục" hoặc "huỷ" việc cần làm. |
ref |
firebaseStorage.Reference |
Nguồn tham chiếu của việc cần làm này. |
Những thay đổi này về trạng thái, được kết hợp với các thuộc tính của TaskSnapshot
giúp bạn theo dõi các sự kiện tải lên một cách đơn giản nhưng hiệu quả.
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 tệp cục bộ không tồn tại hoặc người dùng không có quyền tải lên tệp mong muốn. Bạn có thể xem thêm thông tin về các lỗi trong Xử lý lỗi của phần Tài liệu.
Ví dụ đầy đủ
Ví dụ đầy đủ về một tệp tải lên có tính năng theo dõi tiến trình và xử lý lỗi được hiển thị dưới đây:
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ờ bạn đã tải tệp lên, hãy tìm hiểu cách tải chúng xuống từ Cloud Storage.