0

我的服务器有以下问题,有很多变量在起作用。所以这就是发生的事情。当我在 fedora 的桌面上使用 zend 开发一个小型 web 应用程序时,一切都运行良好。然后我将应用程序传输到 Dreamhost 上的服务器,一切正常。
所以问题出现在需要中国服务器的客户端上,因为他们位于强大的防火墙后面,他们希望更快地传输文件。他们有巨大的文件,大约 3.4 GB。所以他们给了我windows 2003机器虚拟机,他们不能把它换成linux,那就是一切都在螺旋式下降的时候。

基本上,我的应用程序在 documentroot 之外有一个文件夹,所有文件都将通过 ftp 上传。我的应用程序读取文件,只允许登录用户下载文件。

这是我的插件 - 控制器

<?php

class Mapache_Controller_Plugin_AssetGrabber
 extends Zend_Controller_Plugin_Abstract
{

    public function dispatchLoopStartup (Zend_Controller_Request_Abstract $request)
    {
        if ($request->getControllerName() != 'assets')
            return;

        $auth = Zend_Auth::getInstance();
        if (!$auth->hasIdentity()) 
            throw new Exception('Not authenticated!');

        //$file = APPLICATION_PATH . '/../assets/' . $request->getActionName();
        $file = APPLICATION_PATH . '/..' . $_SERVER['REQUEST_URI'];

        $file = str_replace("_", " ", $file);
//      echo $file;
        if (file_exists($file)) {
            header("Content-type: ".$this->new_mime_content_type($file));
            header('Content-disposition: attachment;');
            //header('Content-type: '.$this->new_mime_content_type($file));
            //readfile('$file');
            echo file_get_contents($file);
        }
    }

    function new_mime_content_type($filename){
        $result = new finfo();

        if (is_resource($result) === true){
            return $result->file($filename, FILEINFO_MIME_TYPE);
        }

        return false;
    }

}

我为它在 Windows 上工作所做的唯一更改是添加 $file="d:/"。$_SERVER['REQUEST_URI'];,所以它知道在服务器的 D: 驱动器上查找。

所以基本上我有另一个 php 文件,它执行 scandir 并列出所有文件和目录并创建指向 URL/assets/folder/file 的链接,即使有大文件,它也可以在我的测试服务器上正常工作。但是当我尝试从 Windows 服务器下载 200 mb 的 zip 文件时,我得到一个 228 或 229 字节的损坏的 zip 文件,就像标题一样。
服务器安装了 zend 的 xammp,我快疯了。

迁移回我的 Dreamhost 服务器需要几天时间,我在服务器上安装了一个 rsync 客户端并开始复制文件,但在最后 4 个中它只有 400mb 的副本,所以我的 30 Gb 数据需要几天时间。

当我使用 rdesktop 登录服务器并尝试下载文件时,我仍然得到 228 字节的文件,而不是 200mb 甚至 3.4Gb。它有 Windows 2003。
我是否必须在 apache 服务器上配置一些东西,在 httpd.conf 或 php.ini 上配置一些东西?

4

1 回答 1

1

I found the answer, I need to properly download the file

header('Content-Disposition: attachment;filename="'.basename($file).'"');
                        header('Content-Description: File Transfer');
                        //header('Content-Type: application/octet-stream');
                        header('Content-type: '.$this->new_mime_content_type($file));
                        header('Content-Disposition: attachment; filename='.basename($file));
                        header('Content-Transfer-Encoding: binary');
                        header('Expires: 0');
                        header('Cache-Control: must-revalidate');
                        header('Pragma: public');
                        header('Content-Length: ' . filesize($file));
                        set_time_limit(0);
                        $filex = @fopen($file,"rb");
                        while(!feof($filex))
                        {
                                print(@fread($filex, 1024*8));
                                ob_flush();
                                flush();
                        }

                        //ob_clean();
                        //flush();
                        //readfile($file);
于 2012-10-25T14:38:25.637 回答