0

サーバーには次の問題があります。多くの変数が関係しています。これが起こったことです。Fedora のデスクトップで zend を使用して小さな Web アプリケーションを開発したとき、すべてが完璧に機能していました。次に、アプリをdreamhostのサーバーに転送すると、すべて正常に機能しました。
そのため、中国にサーバーが必要なクライアントに問題が生じます。彼らは強力なファイアウォールの背後にあり、ファイルをより高速に転送したかったからです。約 3.4 GB の巨大なファイルがありました。彼らは私に Windows 2003 マシンの仮想マシンをくれましたが、それを Linux に変更することはできませんでした。

基本的に、私のアプリにはドキュメントルートの外にフォルダーがあり、そこにすべてのファイルが 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: ドライブを参照することがわかっています。

したがって、基本的には、scandir を実行し、すべてのファイルとディレクトリをリストし、URL/assets/folder/file へのリンクを作成する別の php ファイルがあります。大きなファイルでもテスト サーバーで正常に動作します。しかし、Windows サーバーから 200 MB の zip ファイルをダウンロードしようとすると、ヘッダーと同様に 228 または 229 バイトの破損した zip ファイルが取得されます。
サーバーには zend がインストールされた xammp があります。

ドリームホスト サーバーへの移行には数日かかります。サーバーに rsync クライアントをインストールし、ファイルのコピーを開始しましたが、最後の 4 つは 400 MB しかコピーされないため、30 Gb のデータには数日かかります。

rdesktop を使用してサーバーにログオンし、ファイルをダウンロードしようとすると、200MB または 3.4Gb ではなく、228 バイトのファイルが表示されます。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 に答える