回答
尽管有相反的意见,但这个可能是,尽管它不适合心脏不好,因为它需要一些关于HTTP协议的知识以及对文件流的了解。
假设PHP ...
- 通过运行一个PHP脚本文件下载 - 即不具有Web服务器直接从磁盘提供服务的文件,有一个PHP脚本返回。
- 告诉PHP脚本
ignore_user_abort()
- 这将让PHP脚本继续在用户关闭连接后运行 - 发送
Connection: close
头和一个Content-Length: 1234
头,其中1234是被服务的文件大小。 - 使用
fwrite
将文件流式传输到客户端,跟踪您输出的字节数。一旦输出字节数达到文件大小,就知道你已经完成了。客户端将关闭连接,但脚本将继续运行。 - 做任何事情你想通知自己或数据库或文本日志文件,下载成功完成。
但要小心,因为在一个web SAPI中,您可以轻松地运行在PHP的最大时间限制内。
UPDATE:
值得一提的是,如果你这样做,你也应该在你的输出循环增加一个检查connection_aborted
,这样你就无法继续,如果流输出客户端在完成传输之前中止连接。这应该是常识,但不要说我没有提醒你。
只需通过phpscript发送文件。在数据库 如http://exmaple.com/download.php?filename=some_filename.txt
$file=$_GET['filename'];
if (file_exist($file)){
send_message_to_somebody(); //DO what ever you want here and then
$mime = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $file);
header("Content-Type: " . $mime);
header("Content-Transfer-Encoding: binary");
header('Accept-Ranges: bytes');
header('Content-Disposition: attachment; filename="' . basename($file).'"');
header('Content-Length: ' . filesize($file));
readfile($file);
}
这将无法正常工作,因为有了上面的代码,php将尽快终止客户端关闭连接。服务器将无法知道文件是否实际完全下载。 – rdlowrey 2012-08-09 17:00:57
你是对的,我没有仔细阅读 - 错过了_complete_下载很重要 – 2012-08-09 17:10:39
写信息,如果取消下载/中止,如“is_downloaded”栏目将为0,而不是1 ...可怜的说明,没有时间。
这里重要的是_destruct(),这是下载完成的触发器。
<?php
class Download
{
protected $file;
private $session;
private $_last_insert_id;
public function __construct($file, $session)
{
$this->file = $file;
$this->session = $session;
}
public function send()
{
$info = pathinfo($this->file);
$query = DB::insert('downloads', array('user_id', 'file', 'path', 'start'))
->values(array($this->session->get('id'), $info['basename'], $this->file, DB::expr('NOW()')))
->execute();
$this->_last_insert_id = $query[0];
$this->session->set('downloading', 1);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$info['basename'].'"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($this->file));
readfile($this->file);
}
public function __destruct()
{
$aborted = connection_aborted();
$this->session->set('downloading', 0);
$query = DB::update('downloads')->set(array('stop' => DB::expr('NOW()')))->where('id', '=', $this->_last_insert_id)->execute();
}
}
- 1. 如何知道用户是否已下载文件
- 2. Twitter是否知道哪些邮件已被下载以及如何?
- 3. 文件是否被下载?
- 4. 正在阅读的html代码,如何知道是否会被下载?
- 5. 我可以知道一个JavaScript文件是否已被执行?
- 6. 有没有帮助知道属性是否已被Hibernate加载?
- 7. 在Java中,是否有可能知道某个类是否已被加载?
- 8. 如何在Ruby中知道文件是否完全下载
- 9. 如何知道wget是否实际下载了一个文件?
- 10. 如何知道用户是否下载文件?
- 11. 如何知道WebBrowser是否完成下载文件? Visual Basic
- 12. 如何知道下载是否完成
- 13. 不知道文件名下载文件
- 14. 如何知道php文件是从源代码加载
- 15. 办法知道当的ObjectURL已经被下载(撤销它...)
- 16. 如何知道哪些代码已被优化?
- 17. Shell脚本知道文件系统是否已经安装
- 18. 如何知道.NET C#中的文件是否已更改?
- 19. 知道文件的内容是否已经使用Node.js更改
- 20. 如何知道文件是否已经存在与Firefox iMacros
- 21. 下载文件的代码
- 22. XSLT:测试参数知道它是否已被设置
- 23. 如何知道实例是否已准备好被调用?
- 24. 正确的方法来知道活动是否已被销毁
- 25. 如何知道表单是否已被修改
- 26. JQuery UI:是否可以知道对象已被删除?
- 27. 如何知道jedis消息是否已被推送
- 28. 如何知道ESP8266是否已被手动重置?
- 29. 如何知道对象是否已被引用?
- 30. 如何知道setupUi是否已经被调用
@Matt错了...... – rdlowrey 2012-08-09 16:51:30
@rdlowrey我急着等待下面的答案,先生! – Matt 2012-08-09 16:55:30
你的情况如何?你是否从网络服务器下载文件?这是什么类型的网络服务器?等一些更多的信息请 – Kostronor 2012-08-09 16:56:46