如何实时读取和回显正在服务器上写入的上传文件的文件大小,而又不会在服务器和客户端上造成阻塞?

题:


如何实时读取和回显正在服务器上写入的上传文件的文件大小,而又不会在服务器和客户端上造成阻塞?


内容:


文件上传进度被从写入到服务器POST请求所作fetch(),其中body被设置为Blob,File,TypedArray,或ArrayBuffer对象。


当前实现将File对象设置为body传递给的第二个参数的对象fetch()。


需求:


读取echo并向客户端发送写入服务器上文件系统的文件的文件大小text/event-stream。当所有字节(作为变量提供给脚本,作为GET请求中的查询字符串参数)已写入时,停止。当前,文件的读取是在单独的脚本环境中进行的,在该脚本环境中,GET应在POST将文件写入服务器的脚本之后调用应读取文件的脚本。


尚未达到将文件写入服务器或读取文件以获取当前文件大小的潜在问题的错误处理,尽管一旦echo文件大小部分完成,这将是下一步。


目前正尝试使用来满足要求php。虽然也有兴趣在c,bash,nodejs,python,或其他可以用来执行相同任务的语言或方法。


客户端javascript部分不是问题。根本不熟悉php,它是万维网上最常用的服务器端语言之一,用于在不包含不需要的部分的情况下实现该模式。


动机:


获取进度指示器?


有关:


使用ReadableStream获取


问题:


得到


PHP Notice:  Undefined index: HTTP_LAST_EVENT_ID in stream.php on line 7

在terminal。


另外,如果替代


while(file_exists($_GET["filename"]) 

  && filesize($_GET["filename"]) < intval($_GET["filesize"]))

对于


while(true)

在产生错误EventSource。


如果没有sleep()电话,正确的文件大小被派往message事件的3.3MB文件3321824,被印在console 61921,26214和38093次,分别在上传同一文件三次。预期结果是文件在写入时的文件大小


stream_copy_to_stream($input, $file);

而不是上传文件对象的文件大小。是fopen()或stream_copy_to_stream()堵不如到其他不同php的过程stream.php?

智慧大石
浏览 804回答 3
3回答

潇湘沐

您需要使用javascript在块上拆分文件并发送这些块。上载块时,您确切地知道发送了多少数据。这是唯一的方法,而且并不困难。file.startByte&nbsp; += 100000;file.stopByte&nbsp; &nbsp;+= 100000;var reader = new FileReader();reader.onloadend = function(evt) {&nbsp; &nbsp; data.blob = btoa(evt.target.result);&nbsp; &nbsp; /// Do upload here, I do with jQuery ajax}var blob = file.slice(file.startByte, file.stopByte);reader.readAsBinaryString(blob);

GCT1015

效率甚至不如直接检查文件大小。只需将对服务器的不同请求视为浏览器中的不同选项卡即可。您不能直接在不同选项卡中的javascript之间共享数据,而不能使用本地存储,这是sqlite数据库。抱歉,但是SO注释的格式不太适合解释整个LAMP堆栈如何工作。希望我回答了文件锁没有问题的问题。
打开App,查看更多内容
随时随地看视频慕课网APP