繁体   English   中英

确保所有文件都已上传到Web服务器

[英]Make sure all files are uploaded to web server

我有一个需要上传的文件列表,每个文件都是在单独的请求中上传的。 我如何确保每个文件都成功上传,并且如果有任何失败,它们都失败了? 我用来上传文件的代码是:

for (var i = 0; i < files.length; i++) {
  upload(files[i]).then(function(d) {
    // success
    ...
  }).catch(function(d) {
    // fail
    ...  
  });
}

服务器接收每个文件并将其保存在文件夹中。 我想确保我发送的每个文件都已成功上传,如果没有删除,请删除服务器上的所有文件。

由于分别上传每个文件,因此服务器无法知道所有文件是否都成功。

您可以做的是在每次上载时通知您的服务器,以通知下一个文件。 这样,您可以在服务器端(会话/数据库/临时文件)上保留一个列表,其中包含已全部上传的文件和下一个文件。

如果上载的文件混乱(先前的上载通知了下一个不同的文件),则服务器应中止上载和回滚(根据保存的列表删除文件),并向客户端返回错误。

为了使此方法正常工作,剩下的唯一事情是注意最后K个文件无法上传的情况。 在这种情况下,服务器无法自行回滚,因此您必须通知它手动回滚。 您可以通过在捕获代码上创建一个新请求来做到这一点。 像以前一样,当服务器被告知必须回滚时,它应该开始从您的临时列表中删除文件,并对客户端做出错误响应。

如果客户端断开连接,并且无法将请求发送到服务器,那么您唯一的解决方案是使用cron作业

实际上,有一个完美的手工PHP函数-file_exists('filename'),根据'filename'是否存在,它返回true或false。 如果要远程存储文件,则必须包括从根到文件的路径,因此,在您的情况下,它将是file_exists('files / filename')。 要一次检查所有文件,只需将另一个for循环与一些if语句结合使用(以下假定为PHP和可预测的文件名):

$numOfFiles = numOfFiles;
$fileChecker;
$fileKiller;
$safeFiles = 0;

for ($fileChecker = 0; $fileChecker < $numOfFiles; $fileChecker += 1) {
    if (file_exists('files/file' . $fileChecker)) {
        $safeFiles += 1
    }
}

if ($safeFiles < $numOfFiles or intval(date('i')) % 60 === 0) {
    for ($fileKiller = 0; $fileKiller < $safeFiles; $fileKiller += 1) {
        unlink('files/file' . $fileKiller);
    }
}

基本上,这将获取您要上传的文件数(假设它是已知的),并运行一个for循环来验证file [n]是否存在。 对于每个可验证存在的文件,计数器($ safeFiles)都会增加1。

如果安全文件的数量少于文件数量,或者时间可以精确地整整六十(表示小时标记),则通过另一个for循环逐步删除上载的文件,该循环使用$ safeFiles作为上限。 删除本身通过通过unlink()破坏文件引用而发生。

使用unlink()函数有一些陷阱,在这里详细介绍; 确保将目标数据限制为一个文件夹,以便您必须删除最少数量的引用。 一旦数据逸出框,您可能需要删除更多的引用,并且随着您删除越来越多的单个文件实例,该功能将变得越来越长。

intval(date('i'))返回以分钟为单位的时间; 当被60整除时,时间正好是一个小时,例如1300、1400、1100、0100等。这是dandavis建议每小时清除一次服务器的建议,以防止粪便堆积在文件夹中并使系统混乱。

当然,另一种选择是将检查/删除过程所需的数据附加到会话变量,然后将会话数据附加到动态创建的文件夹(在会话过期时删除)。 这样,每个用户都有自己的个人清单,并且您可以从代码中省略按时间顺序删除。 不利的一面是,它可能要复杂得多,尤其是如果那些文件在给定的时间间隔内仅需上传一次时,尤其如此。

如果您想让我解释基于会话的解决方案,请在评论中提问,我将花一些时间来编写它。 我现在不会这样做,因为它显然比此解决方案要长得多,而且我不确定是否正是您要的解决方案。 如果我已经写了足够的内容,感谢您的阅读并祝您项目顺利! :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM