질문:
서버와 서버를 모두 차단하지 않고 업로드된 파일이 서버에 기록되는 동안 실시간 파일 크기를 확인하세요. 및 클라이언트.
컨텍스트:
파일 또는 Blob 본문과 함께 fetch()의 POST 요청을 사용하여 서버에 쓰는 동안 클라이언트 브라우저의 파일 업로드 진행 상황.
요구 사항:
서버 파일 시스템에 기록되는 동안 파일 크기를 텍스트/이벤트 스트림으로 표시합니다. 파일 업로드 중 쿼리 문자열 매개변수로 제공된 모든 바이트가 기록되면 중지됩니다. 파일 크기는 현재 파일이 서버에 작성된 후 호출되는 별도의 스크립트에서 검색됩니다.
구현:
처음에는 PHP를 사용하려고 시도했지만 문제가 발생했습니다. 정의되지 않은 HTTP_LAST_EVENT_ID로 인한 오류와 잘못된 파일 크기가 보고되었습니다. 또한 bash, c, nodejs 및 Python과 같은 다양한 접근 방식과 언어를 실험했습니다.
해결책:
<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>
중요 참고 사항:
위 내용은 서버 바운드 업로드의 실시간 파일 크기를 어떻게 얻을 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!