Rumah >pembangunan bahagian belakang >tutorial php >Bagaimanakah Saya Boleh Mendapatkan Saiz Fail Masa Nyata Muat Naik Terikat Pelayan?
Soalan:
Dapatkan saiz fail masa nyata bagi fail yang dimuat naik semasa ia ditulis ke pelayan tanpa menyekat kedua-dua pelayan dan klien.
Konteks:
Progres muat naik fail dalam penyemak imbas pelanggan semasa menulis ke pelayan menggunakan permintaan POST fetch() dengan Fail atau badan Blob.
Keperluan:
Paparkan saiz fail sebagai teks/strim-acara semasa ia ditulis ke sistem fail pelayan. Berhenti apabila semua bait yang disediakan sebagai parameter rentetan pertanyaan semasa muat naik fail telah ditulis. Saiz fail pada masa ini diambil daripada skrip berasingan, yang dipanggil selepas fail telah ditulis ke pelayan.
Pelaksanaan:
Pada mulanya cuba menggunakan PHP tetapi menghadapi ralat disebabkan HTTP_LAST_EVENT_ID yang tidak ditentukan dan saiz fail yang salah dilaporkan. Juga bereksperimen dengan pendekatan dan bahasa yang berbeza seperti bash, c, nodejs dan python.
Penyelesaian:
<code class="php">clearstatcache(true, $upload); $data = filesize($upload);</code>
<code class="php">// Check if the header's been sent to avoid `PHP Notice: Undefined index: HTTP_LAST_EVENT_ID in stream.php on line ` // php 7+ //$lastId = $_SERVER["HTTP_LAST_EVENT_ID"] ?? 0; // php <ol start="3"> <li>Sertakan fileId dan fileSize sebagai sebahagian daripada permintaan POST dan tambahkan storan dalam memori menggunakan redis atau memcache untuk menyimpan metadata fail.</li> <li>Gunakan EventSource dalam JavaScript sisi klien:</li> </ol> <pre class="brush:php;toolbar:false"><code class="javascript">const [fileId, request, source] = [ Math.random().toString(36).substr(2), new Request(`${url}?fileId=${fileId}&size=${filesize}`, { method: "POST", headers: headers, body: file }), new EventSource(`${stream}?fileId=${fileId}`) ];</code>
<code class="php">function setUnique(string $id, int $size) { // implement with your storage of choice } function updateProgress(string $id, int $processed) { // implement with your storage of choice }</code>
<code class="php">list($progress, $size) = getProgress($_GET["fileId"]);</code>
Nota Penting:
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mendapatkan Saiz Fail Masa Nyata Muat Naik Terikat Pelayan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!