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 < 7 $lastId = isset($_SERVER["HTTP_LAST_EVENT_ID"]) ? intval($_SERVER["HTTP_LAST_EVENT_ID"]) : 0; $upload = $_GET["filename"]; $data = 0; // if file already exists, its initial size can be bigger than the new one, so we need to ignore it $wasLess = $lastId != 0; while ($data < $_GET["filesize"] || !$wasLess) { // system calls are expensive and are being cached with assumption that in most cases file stats do not change often // so we clear cache to get most up to date data clearstatcache(true, $upload); $data = filesize($upload); $wasLess |= $data < $_GET["filesize"]; // don't send stale filesize if ($wasLess) { sendMessage($lastId, $data); $lastId++; } // not necessary here, though without thousands of `message` events will be dispatched //sleep(1); // millions on poor connection and large files. 1 second might be too much, but 50 messages a second must be okay usleep(20000); }</code>
<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!