2017-08-30 50 views
0

嗨,我有以下代码将视频上传到服务器并相应地更新数据库。当我运行一系列图像和/或小视频时,此代码可以正常工作。请参见下面的代码:上传的文件太大php

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; 
    } 
} 

但是,当我的客户端尝试上传大于64MB大的视频节目犯规上传...我已经尝试改变MAX_FILE_SIZE和其他根据参数,允许更大的文件。但我的客户托管服务提供商不允许这样做。

那么有没有其他方法通过我的自定义cms将大文件上传到我的服务器?

Thomas

+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