gpt4 book ai didi

javascript - 使用 PHP 和 AJAX 将大文件分块下载到服务器(远程上传)(强制设置时间限制)

转载 作者:行者123 更新时间:2023-11-28 04:54:27 25 4
gpt4 key购买 nike

有一个question这里(在 StackOverflow 上)询问如何将大文件分块传输给用户。引用代码 originally here ,在 answer这个问题告诉我们如何。我正在寻找如何将文件保存到服务器

注释:

  • 此处的脚本旨在通过提供下载文件的 URL 将文件下载到服务器(此过程也称为远程上传)。
  • 我的服务器提供商禁止我编辑时间限制,因此使用此脚本下载需要时间。
  • 我可以使用file_put_contents("MyFile.iso",$buffer,FILE_APPEND)将文件内容保存到服务器,但不能保存整个文件,主要是因为脚本需要很长时间运行,所以它超时。
  • 我认为解决方案可能是这样工作的:JavaScript 方法通过 AJAX 在后台多次请求 PHP 操作,第一个后台请求告诉 PHP 下载文件的前 100MB。第二个请求告诉 PHP 下载文件的第二个 100MB,依此类推,直到 PHP 告诉 Javascript 我们已到达文件末尾。因此,我们在整个进程中下载该文件(耗时较长),而是在多个进程中下载该文件(耗时较少)。

下面是我需要开始的代码,以便将文件保存/远程上传到服务器:(编辑:它现在将文件保存到服务器,但不是整个文件,主要是因为脚本需要很长时间运行)

<?php
define('CHUNK_SIZE', 1024*1024); // Size (in bytes) of tiles chunk

// Read a file and display its content chunk by chunk
function readfile_chunked($fileurl, $retbytes = TRUE) {
$buffer = '';
$cnt = 0;
$handle = fopen($fileurl, 'rb');

if ($handle === false) {
return false;
}

while (!feof($handle)) {
$buffer = fread($handle, CHUNK_SIZE);
file_put_contents("MyFile.iso",$buffer,FILE_APPEND);
ob_flush();
flush();

if ($retbytes) {
$cnt += strlen($buffer);
}
}

$status = fclose($handle);

if ($retbytes && $status) {
return $cnt; // return num. bytes delivered like readfile() does.
}

return $status;
}

$fileurl = 'http://releases.ubuntu.com/16.04.2/ubuntu-16.04.2-desktop-amd64.iso';
$mimetype = 'mime/type';
header('Content-Type: '.$mimetype );
readfile_chunked($fileurl);

?>

最佳答案

我知道这个问题已经很老了,但我希望我的回答对其他人有帮助。

问题实际上不是“将大文件下载到服务器”,而应该是将大文件上传到服务器

要将大文件上传到服务器,有多种方法。以下是我使用 FileReaderXMLHttpRequest 执行此操作的方法。

https://stackoverflow.com/a/49808460/6348813

这个想法是,您需要将文件作为二进制 (ReadAsBinaryString()) 或 ArrayBuffer (ReadAsArraBuffer()) 读取,然后您可以将文件流式传输到服务器。在 PHP 中,要监听流式 Binary 或 ArrayBuffer,只需使用 php://input 作为监听目录。

您需要考虑在 HTTPS 下执行此操作,否则您的连接将对攻击者开放。

另一种方法,您可以尝试使用slice()方法上传文件。该方法具有良好的性能,支持在连接不稳定时暂停、关闭和恢复上传。

根据我的经验,ReadAsArrayBuffer() 方法似乎比 ReadAsBinaryString() 方法和 slice() 方法更快,即使连接是低于 100kbps。

以上方法都有一些共同的特点,那就是“你不需要设置你的PHP上传限制”。

注意:

请勿使用 ReadAsBinaryString() 方法,因为它已在 MOZILLA 中弃用,并且不支持超过 300MB 的大文件。

This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.

原创文章

https://developer.mozilla.org/en-US/docs/Web/API/FileReader

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest

关于javascript - 使用 PHP 和 AJAX 将大文件分块下载到服务器(远程上传)(强制设置时间限制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42655236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com