2017-08-30 23 views
0

こんにちは私は、サーバーにビデオをアップロードし、それに応じてデータベースを更新する次のコードを持っています。このコードは、たくさんの画像や小さなビデオを使って実行するとうまく動作します。以下のコードを参照してください:アップロードされたファイルが大きすぎます

for ($i=0; $i<count($_FILES['images']['error']); $i++) { 
    if ($_FILES['images']['error'][$i] == UPLOAD_ERR_OK) { 
     $tmpName = $_FILES['images']['tmp_name'][$i]; 
     $name = $_FILES['images']['name'][$i]; 
     $type = $_FILES['images']['type'][$i]; 
     if (strpos($type, 'image') !== false) { 
      $type = "img"; 
     }elseif(strpos($type, 'video') !== false){ 
      $type = "vid"; 
     }else{ 
      exit(); 
     } 
     move_uploaded_file(($tmpName), $dir.$name); 
     $upload = array(
      'name'=>$name, 
      'type'=>$type 
     ); 
     $uploads[] = $upload; 
    } 
} 

しかし、私のクライアントは、プログラムがそれをアップロードdoesntの64メガバイトよりも大きな動画をアップロードしようとすると...私はすでに大きなファイルを許可するようにMAX_FILE_SIZEおよびその他応じてパラメータを変更しようとしました。しかし、私のクライアントホスティングプロバイダはこれを許可しません。

カスタムCMSを使用して大きなファイルをサーバーにアップロードする方法はありますか?

トマス

+0

ホストがあなたの要件を満たすためにこれらの設定を変更できない場合は、別のホストを探してください:) – flauntster

+0

私は大好きですが、クライアントのホストです。 – FutureCake

+1

大きな場合はチャンクを開始してください! :-)一口サイズのチャンクでファイルをチョップし、それらをfwriteでファイルに追加することができます。 –

答えて

1

コメントによると。参照資料はコード例の下にあります。トリックは、ファイルをアップロード制限より小さいチャンクにカットすることです。この方法は、ファイルのアップロードが中断されたときに最後の既知の部分を続けることができるように拡張できます。 :-)

ファイルをアップロードするのに役立つ基本的なJavaScriptクラスで、PHPサーバーに送信するチャンクを決定します。

function fileUploader() { 
    // Called when the file is selected 
    this.onFileSelected = function() { 
     // Read file input (input type="file") 
     this.file = this.fileInput.files[0]; 
     this.file_size = this.file.size; 
     this.chunk_size = (1024 * 1000); 

     this.range_start = 0; 
     this.range_end = this.chunk_size; 

     this.slice_method = 'slice'; 
     this.request = new XMLHttpRequest(); 

     // Start uploading 
     this.upload(); 
    }; 

    this.upload = function() 
    { 
     var self = this, 
      chunk; 

     // Last part reached 
     if (this.range_end > this.file_size) { 
      this.range_end = this.file_size; 
     } 

     // Chunk the file using the slice method 
     chunk = this.file[this.slice_method](this.range_start, this.range_end); 

     // Open a XMLHttpRequest 
     var endpoint = "/url/to/php/server/for/processing"; 
     this.request.open('PUT', (endpoint)); 
     this.request.overrideMimeType('application/octet-stream'); 
     this.request.send(chunk); 

     // Make sure we do it synchronously to prevent data corruption 
     this.request.onreadystatechange = function() 
     { 
      if (self.request.readyState == XMLHttpRequest.DONE && self.request.status == 200) { 
       self.onChunkComplete(); 
      } 
     } 
    }; 

    this.onChunkComplete = function() 
    { 
     if (this.range_end === this.file_size) 
     { 
      // We are done, stop uploading 
      return; 
     } 

     this.range_start = this.range_end; 
     this.range_end = this.range_start + this.chunk_size; 
     this.upload(); 
    }; 
} 

そしてPHPビット用

:ここ

... 
$out = fopen("{$filePath}.partial", "a+");      
fwrite($out, file_get_contents("php://input")); 
fclose($out); 
... 

ビッグ警告、適切に検証し、機能をアップロードするあなたの顧客の安全を確保するためのセキュリティ対策を講じてください。生のPHP入力をファイルに書き出しています。

アップロードが完了したら、ファイルの名前を正しい拡張子を含む元の名前に変更できます。

基準物質:一言で言えば
http://creativejs.com/tutorials/advanced-uploading-techniques-part-1/index.html
https://secure.php.net/manual/en/wrappers.php.php

...それは(あなたが正常にファイルをアップロードしまうような)従来の方法を使用してファイルをアップロードし、プロセッサを使用して小さなチャンクにファイルを分割です、追加一時ファイルへの入力。私が遭遇した落とし穴のいくつかは、エンドポイントに余分なパラメータなどを送信し、ファイルに追加されたものを避けてファイルを破損させます。

+1

これは大いに役立ちます! – FutureCake

関連する問題