


Memuat naik fail besar ke awan boleh menjadi mencabar — gangguan rangkaian, pengehadan penyemak imbas dan saiz fail yang besar boleh mengganggu proses dengan mudah. Amazon S3 (Perkhidmatan Storan Mudah) ialah perkhidmatan storan awan berasaskan web yang boleh skala, berkelajuan tinggi, direka untuk sandaran dalam talian dan mengarkibkan data dan aplikasi. Walau bagaimanapun, memuat naik fail besar ke S3 memerlukan pengendalian yang teliti untuk memastikan kebolehpercayaan dan prestasi.
Masukkan muat naik berbilang bahagian AWS S3: penyelesaian berkuasa yang memecahkan fail besar kepada bahagian yang lebih kecil, membolehkan muat naik yang lebih pantas dan lebih dipercayai dengan menangani setiap bahagian secara bebas malah memuat naik bahagian secara selari. Kaedah ini bukan sahaja mengatasi had saiz fail (S3 memerlukan muat naik berbilang bahagian untuk fail yang lebih besar daripada 5GB) tetapi juga meminimumkan risiko kegagalan, menjadikannya sesuai untuk aplikasi yang memerlukan muat naik fail yang lancar dan mantap.
Dalam panduan ini, kami akan membongkar selok-belok muat naik berbilang bahagian pelanggan ke S3, menunjukkan kepada anda sebab ia merupakan pilihan bijak untuk mengendalikan fail besar, cara untuk menyediakannya dan berjalan dengan selamat serta cabaran yang perlu diperhatikan. keluar untuk. Saya akan memberikan arahan langkah demi langkah, contoh kod dan amalan terbaik untuk membantu anda melaksanakan penyelesaian muat naik fail sebelah pelanggan yang boleh dipercayai.
Bersedia untuk meningkatkan pengalaman memuat naik fail anda? Mari selami!
Pelayan lwn. Muat Naik Sebelah Pelanggan
Apabila mereka bentuk sistem muat naik fail, anda mempunyai dua pilihan utama: memuat naik fail melalui pelayan anda (sebelah pelayan) atau memuat naik fail terus daripada klien ke S3 (sebelah klien). Setiap pendekatan ada kebaikan dan keburukannya.
Muat Naik Bahagian Pelayan
Kelebihan:
Keselamatan Dipertingkat: Semua muat naik diuruskan oleh pelayan, memastikan kelayakan AWS selamat.
Pengendalian Ralat yang Lebih Baik: Pelayan boleh mengurus percubaan semula, pengelogan dan pengendalian ralat dengan lebih mantap.
Pemprosesan Berpusat: Fail boleh disahkan, diproses atau ditukar pada pelayan sebelum disimpan dalam S3.
Keburukan:
Muatan Pelayan yang Lebih Tinggi: Muat naik yang besar menggunakan sumber pelayan (CPU, memori, lebar jalur), yang boleh memberi kesan kepada prestasi dan meningkatkan kos operasi.
Potensi Kesesakan: Pelayan boleh menjadi satu titik kegagalan atau kesesakan prestasi semasa trafik muat naik tinggi, yang membawa kepada muat naik perlahan atau masa henti.
Kos Peningkatan: Mengendalikan muat naik di bahagian pelayan mungkin memerlukan penskalaan infrastruktur anda untuk mengendalikan beban puncak, meningkatkan perbelanjaan operasi.
Muat Naik Bahagian Pelanggan
Kelebihan:
Muatan Pelayan Dikurangkan: Fail dihantar terus dari peranti pengguna ke S3, membebaskan sumber pelayan.
Kelajuan yang Dipertingkat: Pengguna mengalami muat naik yang lebih pantas kerana mereka memintas pelayan aplikasi.
Kecekapan Kos: Menghapuskan keperluan untuk infrastruktur pelayan untuk mengendalikan muat naik yang besar, yang berpotensi mengurangkan kos.
Skalabiliti: Sesuai untuk menskalakan muat naik fail tanpa menekankan pelayan bahagian belakang.
Keburukan:
Risiko Keselamatan: Memerlukan pengendalian teliti bukti kelayakan dan kebenaran AWS. URL yang ditetapkan mesti dijana dengan selamat untuk menghalang akses tanpa kebenaran.
Kawalan Terhad: Kurang pengawasan sebelah pelayan terhadap muat naik; pengendalian ralat dan cuba semula selalunya diuruskan pada klien.
Kekangan Pelayar: Penyemak imbas mempunyai had memori dan API, yang boleh menghalang pengendalian fail yang sangat besar atau menjejaskan prestasi pada peranti kelas bawah.
Panduan Langkah demi Langkah untuk Melaksanakan Muat Naik Sebelah Pelanggan yang Selamat
Melaksanakan muat naik bahagian pelanggan dengan selamat melibatkan penyelarasan antara aplikasi bahagian hadapan anda dan perkhidmatan bahagian belakang yang selamat. Peranan utama perkhidmatan bahagian belakang adalah untuk menjana URL yang ditetapkan, membolehkan pelanggan memuat naik fail terus ke S3 tanpa mendedahkan bukti kelayakan AWS yang sensitif.
Prasyarat
- Akaun AWS: Akses kepada akaun AWS dengan kebenaran untuk menggunakan S3.
- Pengetahuan AWS SDK: Kebiasaan dengan AWS SDK untuk JavaScript (v3) atau membuat panggilan API terus ke perkhidmatan AWS.
- Kemahiran Pembangunan Bahagian Depan dan Belakang: Memahami pengaturcaraan kedua-dua pihak klien (JavaScript, React, dll.) dan sisi pelayan (Node.js, Express, dll.).
1. Sediakan Seni Bina yang Betul
Untuk melaksanakan muat naik sebelah pelanggan dengan berkesan, anda memerlukan:
- Aplikasi Depan: Mengendalikan pemilihan fail, membahagikan fail kepada bahagian jika perlu dan memuat naik bahagian ke S3 menggunakan URL yang ditetapkan.
- Perkhidmatan Backend: Pelayan selamat yang menyediakan API untuk menjana URL yang ditetapkan dan memulakan atau melengkapkan muat naik berbilang bahagian. Ia memastikan kelayakan AWS anda selamat dan menguatkuasakan sebarang logik atau pengesahan perniagaan yang diperlukan.
Seni bina ini memastikan operasi sensitif dikendalikan dengan selamat pada bahagian belakang, manakala bahagian hadapan menguruskan proses muat naik.
2. Mencipta Perkhidmatan Muat Naik pada Bahagian Belakang
Mengapa Menggunakan URL Ditetapkan?
URL yang ditetapkan membenarkan pelanggan berinteraksi dengan S3 secara langsung, melakukan operasi seperti memuat naik fail tanpa memerlukan bukti kelayakan AWS di sisi klien. Mereka selamat kerana:
- Ia terhad masa dan tamat tempoh selepas tempoh yang ditetapkan.
- Ia boleh dihadkan kepada operasi tertentu (cth., PUT untuk memuat naik).
- Ia khusus untuk kunci objek S3 tertentu.
Melaksanakan S3UploadService
Buat kelas perkhidmatan pada pelayan anda yang bertanggungjawab untuk:
a. Menentukan baldi dan rantau S3
b. Mewujudkan bukti kelayakan AWS dengan selamat.
c. Menyediakan kaedah untuk menjana URL yang ditetapkan dan mengurus muat naik berbilang bahagian.
// services/S3UploadService.js import { S3Client, CreateMultipartUploadCommand, CompleteMultipartUploadCommand, UploadPartCommand, AbortMultipartUploadCommand, PutObjectCommand, GetObjectCommand, DeleteObjectCommand, } from '@aws-sdk/client-s3'; import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; // Import credential providers import { fromIni, fromInstanceMetadata, fromEnv, fromProcess, } from '@aws-sdk/credential-providers'; export class S3UploadService { constructor() { this.s3BucketName = process.env.S3_BUCKET_NAME; this.s3Region = process.env.S3_REGION; this.s3Client = new S3Client({ region: this.s3Region, credentials: this.getS3ClientCredentials(), }); } // Method to generate AWS credentials securely getS3ClientCredentials() { if (process.env.NODE_ENV === 'development') { // In development, use credentials from environment variables return fromEnv(); } else { // In production, use credentials from EC2 instance metadata or another secure method return fromInstanceMetadata(); } } // Generate a presigned URL for single-part upload (PUT), download (GET), or deletion (DELETE) async generatePresignedUrl(key, operation) { let command; switch (operation) { case 'PUT': command = new PutObjectCommand({ Bucket: this.s3BucketName, Key: key, }); break; case 'GET': command = new GetObjectCommand({ Bucket: this.s3BucketName, Key: key, }); break; case 'DELETE': command = new DeleteObjectCommand({ Bucket: this.s3BucketName, Key: key, }); break; default: throw new Error(`Invalid operation "${operation}"`); } // Generate presigned URL return await getSignedUrl(this.s3Client, command, { expiresIn: 3600 }); // Expires in 1 hour } // Methods for multipart upload async createMultipartUpload(key) { const command = new CreateMultipartUploadCommand({ Bucket: this.s3BucketName, Key: key, }); const response = await this.s3Client.send(command); return response.UploadId; } async generateUploadPartUrl(key, uploadId, partNumber) { const command = new UploadPartCommand({ Bucket: this.s3BucketName, Key: key, UploadId: uploadId, PartNumber: partNumber, }); return await getSignedUrl(this.s3Client, command, { expiresIn: 3600 }); } async completeMultipartUpload(key, uploadId, parts) { const command = new CompleteMultipartUploadCommand({ Bucket: this.s3BucketName, Key: key, UploadId: uploadId, MultipartUpload: { Parts: parts }, }); return await this.s3Client.send(command); } async abortMultipartUpload(key, uploadId) { const command = new AbortMultipartUploadCommand({ Bucket: this.s3BucketName, Key: key, UploadId: uploadId, }); return await this.s3Client.send(command); } }
Nota: Pastikan bukti kelayakan AWS anda diurus dengan selamat. Dalam pengeluaran, adalah disyorkan untuk menggunakan peranan IAM yang dilampirkan pada kejadian EC2 atau tugas ECS anda, berbanding kelayakan pengekodan keras atau menggunakan pembolehubah persekitaran.
3. Melaksanakan Titik Akhir API Bahagian Belakang
Buat titik akhir API di bahagian belakang anda untuk mengendalikan permintaan daripada bahagian hadapan. Titik akhir ini akan menggunakan S3UploadService untuk melakukan tindakan.
// controllers/S3UploadController.js import { S3UploadService } from '../services/S3UploadService'; const s3UploadService = new S3UploadService(); export const generatePresignedUrl = async (req, res, next) => { try { const { key, operation } = req.body; // key is the S3 object key (file identifier) const url = await s3UploadService.generatePresignedUrl(key, operation); res.status(200).json({ url }); } catch (error) { next(error); } }; export const initializeMultipartUpload = async (req, res, next) => { try { const { key } = req.body; const uploadId = await s3UploadService.createMultipartUpload(key); res.status(200).json({ uploadId }); } catch (error) { next(error); } }; export const generateUploadPartUrls = async (req, res, next) => { try { const { key, uploadId, parts } = req.body; // parts is the number of parts const urls = await Promise.all( [...Array(parts).keys()].map(async (index) => { const partNumber = index + 1; const url = await s3UploadService.generateUploadPartUrl(key, uploadId, partNumber); return { partNumber, url }; }) ); res.status(200).json({ urls }); } catch (error) { next(error); } }; export const completeMultipartUpload = async (req, res, next) => { try { const { key, uploadId, parts } = req.body; // parts is an array of { ETag, PartNumber } const result = await s3UploadService.completeMultipartUpload(key, uploadId, parts); res.status(200).json({ result }); } catch (error) { next(error); } }; export const abortMultipartUpload = async (req, res, next) => { try { const { key, uploadId } = req.body; await s3UploadService.abortMultipartUpload(key, uploadId); res.status(200).json({ message: 'Upload aborted' }); } catch (error) { next(error); } };
Sediakan laluan untuk titik akhir ini dalam apl Express anda atau mana-mana rangka kerja yang anda gunakan.
4. Melaksanakan Kelas Pemuat Naik Depan
Halaman hadapan akan mengendalikan pemilihan fail, memutuskan sama ada untuk melakukan muat naik satu bahagian atau berbilang bahagian berdasarkan saiz fail dan mengurus proses muat naik.
Secara umum, AWS mengesyorkan "apabila saiz objek anda mencapai 100 MB, anda harus mempertimbangkan untuk menggunakan muat naik berbilang bahagian dan bukannya memuat naik objek dalam satu operasi." Sumber
// services/S3UploadService.js import { S3Client, CreateMultipartUploadCommand, CompleteMultipartUploadCommand, UploadPartCommand, AbortMultipartUploadCommand, PutObjectCommand, GetObjectCommand, DeleteObjectCommand, } from '@aws-sdk/client-s3'; import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; // Import credential providers import { fromIni, fromInstanceMetadata, fromEnv, fromProcess, } from '@aws-sdk/credential-providers'; export class S3UploadService { constructor() { this.s3BucketName = process.env.S3_BUCKET_NAME; this.s3Region = process.env.S3_REGION; this.s3Client = new S3Client({ region: this.s3Region, credentials: this.getS3ClientCredentials(), }); } // Method to generate AWS credentials securely getS3ClientCredentials() { if (process.env.NODE_ENV === 'development') { // In development, use credentials from environment variables return fromEnv(); } else { // In production, use credentials from EC2 instance metadata or another secure method return fromInstanceMetadata(); } } // Generate a presigned URL for single-part upload (PUT), download (GET), or deletion (DELETE) async generatePresignedUrl(key, operation) { let command; switch (operation) { case 'PUT': command = new PutObjectCommand({ Bucket: this.s3BucketName, Key: key, }); break; case 'GET': command = new GetObjectCommand({ Bucket: this.s3BucketName, Key: key, }); break; case 'DELETE': command = new DeleteObjectCommand({ Bucket: this.s3BucketName, Key: key, }); break; default: throw new Error(`Invalid operation "${operation}"`); } // Generate presigned URL return await getSignedUrl(this.s3Client, command, { expiresIn: 3600 }); // Expires in 1 hour } // Methods for multipart upload async createMultipartUpload(key) { const command = new CreateMultipartUploadCommand({ Bucket: this.s3BucketName, Key: key, }); const response = await this.s3Client.send(command); return response.UploadId; } async generateUploadPartUrl(key, uploadId, partNumber) { const command = new UploadPartCommand({ Bucket: this.s3BucketName, Key: key, UploadId: uploadId, PartNumber: partNumber, }); return await getSignedUrl(this.s3Client, command, { expiresIn: 3600 }); } async completeMultipartUpload(key, uploadId, parts) { const command = new CompleteMultipartUploadCommand({ Bucket: this.s3BucketName, Key: key, UploadId: uploadId, MultipartUpload: { Parts: parts }, }); return await this.s3Client.send(command); } async abortMultipartUpload(key, uploadId) { const command = new AbortMultipartUploadCommand({ Bucket: this.s3BucketName, Key: key, UploadId: uploadId, }); return await this.s3Client.send(command); } }
Contoh Penggunaan
// controllers/S3UploadController.js import { S3UploadService } from '../services/S3UploadService'; const s3UploadService = new S3UploadService(); export const generatePresignedUrl = async (req, res, next) => { try { const { key, operation } = req.body; // key is the S3 object key (file identifier) const url = await s3UploadService.generatePresignedUrl(key, operation); res.status(200).json({ url }); } catch (error) { next(error); } }; export const initializeMultipartUpload = async (req, res, next) => { try { const { key } = req.body; const uploadId = await s3UploadService.createMultipartUpload(key); res.status(200).json({ uploadId }); } catch (error) { next(error); } }; export const generateUploadPartUrls = async (req, res, next) => { try { const { key, uploadId, parts } = req.body; // parts is the number of parts const urls = await Promise.all( [...Array(parts).keys()].map(async (index) => { const partNumber = index + 1; const url = await s3UploadService.generateUploadPartUrl(key, uploadId, partNumber); return { partNumber, url }; }) ); res.status(200).json({ urls }); } catch (error) { next(error); } }; export const completeMultipartUpload = async (req, res, next) => { try { const { key, uploadId, parts } = req.body; // parts is an array of { ETag, PartNumber } const result = await s3UploadService.completeMultipartUpload(key, uploadId, parts); res.status(200).json({ result }); } catch (error) { next(error); } }; export const abortMultipartUpload = async (req, res, next) => { try { const { key, uploadId } = req.body; await s3UploadService.abortMultipartUpload(key, uploadId); res.status(200).json({ message: 'Upload aborted' }); } catch (error) { next(error); } };
5. Pertimbangan Keselamatan dan Amalan Terbaik
- Hadkan Kebenaran URL Ditetapkan: Pastikan URL yang ditetapkan hanya memberikan kebenaran yang diperlukan (cth., hanya membenarkan operasi PUT untuk muat naik).
- Tetapkan Masa Tamat Tempoh Yang Sesuai: URL yang ditetapkan hendaklah tamat tempoh selepas masa yang munasabah (cth., 15 minit hingga 1 jam) untuk meminimumkan tetingkap penyalahgunaan.
- Sahkan Metadata Fail: Pada bahagian belakang, sahkan sebarang metadata atau parameter yang dihantar daripada klien untuk mengelakkan manipulasi (cth., menguatkuasakan jenis atau saiz fail yang dibenarkan).
- Gunakan HTTPS: Sentiasa gunakan HTTPS untuk komunikasi antara klien dan hujung belakang anda, dan apabila mengakses S3, untuk melindungi data dalam transit.
- Pantau dan Log: Laksanakan pengelogan dan pemantauan pada kedua-dua bahagian belakang dan S3 untuk mengesan sebarang aktiviti atau ralat luar biasa.
6. Pertimbangan Tambahan
Mengehadkan Saiz Objek
Walaupun AWS S3 menyokong objek bersaiz sehingga 5 TiB (terabait), memuat naik fail besar itu terus daripada penyemak imbas adalah tidak praktikal dan selalunya mustahil disebabkan oleh pengehadan penyemak imbas dan kekangan sumber pihak pelanggan. Penyemak imbas boleh ranap atau tidak bertindak balas apabila mengendalikan fail yang sangat besar, terutamanya jika ia perlu diproses dalam ingatan.
Syor:
- Tetapkan Had Praktikal: Tentukan saiz fail maksimum yang akan disokong oleh aplikasi anda untuk muat naik sisi klien (cth., 100 GB atau kurang).
- Maklumkan Pengguna: Berikan maklum balas kepada pengguna tentang saiz fail maksimum yang dibenarkan dan pengendalian pengesahan pada bahagian klien sebelum memulakan muat naik.
Cuba semula Strategi
Memuat naik fail besar meningkatkan risiko gangguan atau kegagalan rangkaian semasa proses muat naik. Melaksanakan strategi cuba semula yang mantap adalah penting untuk meningkatkan pengalaman pengguna dan memastikan muat naik yang berjaya.
strategi
- Cuba Semula Automatik: Cuba semula bahagian yang gagal secara automatik beberapa kali terhad sebelum menggesa pengguna.
- Muat Naik Boleh Disambung Semula: Jejaki bahagian yang dimuat naik supaya muat naik boleh disambung semula dari tempat ia berhenti dan bukannya bermula semula.
- Pengendalian Ralat: Berikan mesej ralat bermaklumat kepada pengguna jika percubaan semula gagal, mungkin mencadangkan tindakan seperti menyemak sambungan rangkaian mereka.
Pembersihan Muat Naik Berbilang Bahagian
Muat naik berbilang bahagian yang tidak lengkap boleh terkumpul dalam baldi S3 anda, memakan ruang storan dan berkemungkinan menimbulkan kos.
Pertimbangan
- Batalkan Muat Naik Yang Belum Selesai: Jika muat naik gagal atau dibatalkan, pastikan aplikasi anda memanggil API AbortMultipartUpload untuk membersihkan mana-mana bahagian yang dimuat naik.
- Peraturan Kitaran Hayat: Konfigurasikan dasar Kitaran Hayat S3 untuk membatalkan muat naik berbilang bahagian yang tidak lengkap secara automatik selepas tempoh tertentu (mis., 7 hari). Ini membantu mengurus kos penyimpanan dan memastikan baldi anda bersih.
Contoh Konfigurasi Peraturan Kitar Hayat:
// services/S3UploadService.js import { S3Client, CreateMultipartUploadCommand, CompleteMultipartUploadCommand, UploadPartCommand, AbortMultipartUploadCommand, PutObjectCommand, GetObjectCommand, DeleteObjectCommand, } from '@aws-sdk/client-s3'; import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; // Import credential providers import { fromIni, fromInstanceMetadata, fromEnv, fromProcess, } from '@aws-sdk/credential-providers'; export class S3UploadService { constructor() { this.s3BucketName = process.env.S3_BUCKET_NAME; this.s3Region = process.env.S3_REGION; this.s3Client = new S3Client({ region: this.s3Region, credentials: this.getS3ClientCredentials(), }); } // Method to generate AWS credentials securely getS3ClientCredentials() { if (process.env.NODE_ENV === 'development') { // In development, use credentials from environment variables return fromEnv(); } else { // In production, use credentials from EC2 instance metadata or another secure method return fromInstanceMetadata(); } } // Generate a presigned URL for single-part upload (PUT), download (GET), or deletion (DELETE) async generatePresignedUrl(key, operation) { let command; switch (operation) { case 'PUT': command = new PutObjectCommand({ Bucket: this.s3BucketName, Key: key, }); break; case 'GET': command = new GetObjectCommand({ Bucket: this.s3BucketName, Key: key, }); break; case 'DELETE': command = new DeleteObjectCommand({ Bucket: this.s3BucketName, Key: key, }); break; default: throw new Error(`Invalid operation "${operation}"`); } // Generate presigned URL return await getSignedUrl(this.s3Client, command, { expiresIn: 3600 }); // Expires in 1 hour } // Methods for multipart upload async createMultipartUpload(key) { const command = new CreateMultipartUploadCommand({ Bucket: this.s3BucketName, Key: key, }); const response = await this.s3Client.send(command); return response.UploadId; } async generateUploadPartUrl(key, uploadId, partNumber) { const command = new UploadPartCommand({ Bucket: this.s3BucketName, Key: key, UploadId: uploadId, PartNumber: partNumber, }); return await getSignedUrl(this.s3Client, command, { expiresIn: 3600 }); } async completeMultipartUpload(key, uploadId, parts) { const command = new CompleteMultipartUploadCommand({ Bucket: this.s3BucketName, Key: key, UploadId: uploadId, MultipartUpload: { Parts: parts }, }); return await this.s3Client.send(command); } async abortMultipartUpload(key, uploadId) { const command = new AbortMultipartUploadCommand({ Bucket: this.s3BucketName, Key: key, UploadId: uploadId, }); return await this.s3Client.send(command); } }
Mengendalikan Muat Naik Berbilang Bahagian dari Benang Utama
Memuat naik fail besar boleh memerlukan sumber dan boleh menyebabkan urutan utama penyemak imbas menjadi tidak bertindak balas, membawa kepada pengalaman pengguna yang buruk.
Penyelesaian:
- Gunakan Pekerja Web: Muat naik proses muat naik ke Pekerja Web. Pekerja Web berjalan di latar belakang, berasingan daripada urutan pelaksanaan utama aplikasi web, membolehkan anda melakukan operasi intensif sumber tanpa menyekat UI.
Faedah:
- Prestasi yang Dipertingkat: Membebaskan utas utama, memastikan UI kekal responsif semasa proses muat naik.
- Penggunaan Memori yang Dikurangkan: Membantu mengurus memori dengan lebih berkesan, kerana pemprosesan data yang besar boleh dikendalikan dalam pekerja.
- Kestabilan Dipertingkat: Mengurangkan risiko penyemak imbas menjadi tidak bertindak balas atau ranap semasa muat naik besar.
7. Pertimbangan Keserasian Pelayar
Apabila melaksanakan muat naik berbilang bahagian sisi klien, keserasian penyemak imbas sememangnya menjadi kebimbangan. Penyemak imbas yang berbeza mungkin mempunyai tahap sokongan yang berbeza-beza untuk API dan ciri yang diperlukan untuk mengendalikan muat naik fail yang besar, seperti *API Fail, Penghirisan Blob, Pekerja Web dan pengendalian permintaan rangkaian* . Menavigasi perbezaan ini dengan jayanya adalah penting untuk memastikan pengalaman pengguna yang konsisten dan boleh dipercayai merentas semua penyemak imbas yang disokong.
Kebimbangan Keserasian:
- API Fail dan Kaedah Blob: Kebanyakan penyemak imbas moden menyokong Blob.slice(), tetapi pelayar lama mungkin menggunakan Blob.webkitSlice() atau Blob.mozSlice().
- Pekerja Web: Disokong dalam penyemak imbas moden, tetapi tidak dalam beberapa penyemak imbas yang lebih lama atau dengan pengehadan dalam Internet Explorer.
- Api Ambil dan XMLHttpRequest: Walaupun fetch() disokong secara meluas, acara kemajuan muat naik dengan fetch() tidak tersedia secara konsisten merentas semua penyemak imbas.
- Sambungan Serentak Maksimum: Hadkan bilangan muat naik serentak berdasarkan penyebut biasa yang paling rendah antara penyemak imbas anda yang disokong (cth., 6 sambungan serentak).
- Kekangan Memori: Proses fail dalam ketulan kecil dan elakkan memuatkan keseluruhan fail ke dalam memori sekaligus.
- CORS: Konfigurasikan dasar S3 CORS untuk menyokong kaedah HTTP yang diperlukan (cth., PUT, POST) dan pengepala.
Kesimpulan
Dengan melaksanakan muat naik sebelah klien dengan URL yang ditetapkan dan muat naik berbilang bahagian, anda boleh mengendalikan muat naik fail dalam sebarang saiz terus ke S3 dengan cekap, mengurangkan beban pelayan dan meningkatkan prestasi. Ingatlah untuk mengekalkan keselamatan di barisan hadapan dengan mengurus bukti kelayakan AWS dengan selamat dan mengehadkan kebenaran dan jangka hayat URL yang ditetapkan.
Panduan ini menyediakan pendekatan langkah demi langkah untuk menyediakan sistem muat naik fail yang selamat dan berskala menggunakan AWS S3, AWS SDK untuk JavaScript dan URL yang ditetapkan. Dengan contoh kod dan amalan terbaik yang disediakan, anda sedang dalam perjalanan untuk meningkatkan keupayaan muat naik fail aplikasi anda.
Atas ialah kandungan terperinci Mengoptimumkan Muat Naik Fail Besar: Muat Naik Berbilang Bahagian Sebelah Pelanggan yang Selamat ke AWS S3. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Aplikasi JavaScript di dunia nyata termasuk pembangunan depan dan back-end. 1) Memaparkan aplikasi front-end dengan membina aplikasi senarai TODO, yang melibatkan operasi DOM dan pemprosesan acara. 2) Membina Restfulapi melalui Node.js dan menyatakan untuk menunjukkan aplikasi back-end.

Penggunaan utama JavaScript dalam pembangunan web termasuk interaksi klien, pengesahan bentuk dan komunikasi tak segerak. 1) kemas kini kandungan dinamik dan interaksi pengguna melalui operasi DOM; 2) pengesahan pelanggan dijalankan sebelum pengguna mengemukakan data untuk meningkatkan pengalaman pengguna; 3) Komunikasi yang tidak bersesuaian dengan pelayan dicapai melalui teknologi Ajax.

Memahami bagaimana enjin JavaScript berfungsi secara dalaman adalah penting kepada pemaju kerana ia membantu menulis kod yang lebih cekap dan memahami kesesakan prestasi dan strategi pengoptimuman. 1) aliran kerja enjin termasuk tiga peringkat: parsing, penyusun dan pelaksanaan; 2) Semasa proses pelaksanaan, enjin akan melakukan pengoptimuman dinamik, seperti cache dalam talian dan kelas tersembunyi; 3) Amalan terbaik termasuk mengelakkan pembolehubah global, mengoptimumkan gelung, menggunakan const dan membiarkan, dan mengelakkan penggunaan penutupan yang berlebihan.

Python lebih sesuai untuk pemula, dengan lengkung pembelajaran yang lancar dan sintaks ringkas; JavaScript sesuai untuk pembangunan front-end, dengan lengkung pembelajaran yang curam dan sintaks yang fleksibel. 1. Sintaks Python adalah intuitif dan sesuai untuk sains data dan pembangunan back-end. 2. JavaScript adalah fleksibel dan digunakan secara meluas dalam pengaturcaraan depan dan pelayan.

Python dan JavaScript mempunyai kelebihan dan kekurangan mereka sendiri dari segi komuniti, perpustakaan dan sumber. 1) Komuniti Python mesra dan sesuai untuk pemula, tetapi sumber pembangunan depan tidak kaya dengan JavaScript. 2) Python berkuasa dalam bidang sains data dan perpustakaan pembelajaran mesin, sementara JavaScript lebih baik dalam perpustakaan pembangunan dan kerangka pembangunan depan. 3) Kedua -duanya mempunyai sumber pembelajaran yang kaya, tetapi Python sesuai untuk memulakan dengan dokumen rasmi, sementara JavaScript lebih baik dengan MDNWebDocs. Pilihan harus berdasarkan keperluan projek dan kepentingan peribadi.

Peralihan dari C/C ke JavaScript memerlukan menyesuaikan diri dengan menaip dinamik, pengumpulan sampah dan pengaturcaraan asynchronous. 1) C/C adalah bahasa yang ditaip secara statik yang memerlukan pengurusan memori manual, manakala JavaScript ditaip secara dinamik dan pengumpulan sampah diproses secara automatik. 2) C/C perlu dikumpulkan ke dalam kod mesin, manakala JavaScript adalah bahasa yang ditafsirkan. 3) JavaScript memperkenalkan konsep seperti penutupan, rantaian prototaip dan janji, yang meningkatkan keupayaan pengaturcaraan fleksibiliti dan asynchronous.

Enjin JavaScript yang berbeza mempunyai kesan yang berbeza apabila menguraikan dan melaksanakan kod JavaScript, kerana prinsip pelaksanaan dan strategi pengoptimuman setiap enjin berbeza. 1. Analisis leksikal: Menukar kod sumber ke dalam unit leksikal. 2. Analisis Tatabahasa: Menjana pokok sintaks abstrak. 3. Pengoptimuman dan Penyusunan: Menjana kod mesin melalui pengkompil JIT. 4. Jalankan: Jalankan kod mesin. Enjin V8 mengoptimumkan melalui kompilasi segera dan kelas tersembunyi, Spidermonkey menggunakan sistem kesimpulan jenis, menghasilkan prestasi prestasi yang berbeza pada kod yang sama.

Aplikasi JavaScript di dunia nyata termasuk pengaturcaraan sisi pelayan, pembangunan aplikasi mudah alih dan Internet of Things Control: 1. Pengaturcaraan sisi pelayan direalisasikan melalui node.js, sesuai untuk pemprosesan permintaan serentak yang tinggi. 2. Pembangunan aplikasi mudah alih dijalankan melalui reaktnatif dan menyokong penggunaan silang platform. 3. Digunakan untuk kawalan peranti IoT melalui Perpustakaan Johnny-Five, sesuai untuk interaksi perkakasan.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

mPDF
mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

VSCode Windows 64-bit Muat Turun
Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

EditPlus versi Cina retak
Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

MantisBT
Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan