2017-08-30 4 views
0

Bonjour, j'ai le code suivant qui télécharge des vidéos sur un serveur et met à jour la base de données en conséquence. Ce code fonctionne bien quand je le lance avec un tas d'images et de petites vidéos. Voir le code ci-dessous:le fichier envoyé est trop gros 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; 
    } 
} 

Mais quand mon client essaie de télécharger une vidéo plus grande que 64MB programme ne marche pas le télécharger ... Je l'ai déjà essayé de changer le max_file_size et d'autres paramètres en fonction pour permettre des fichiers plus gros. Mais mon fournisseur d'hébergement de clients ne permet pas cela.

Y a-t-il d'autres moyens de télécharger de gros fichiers sur mon serveur via mes cms personnalisés?

Thomas

+0

Si votre hôte ne vous permet pas de modifier ces paramètres pour répondre à vos besoins, trouvez un autre hôte :) – flauntster

+0

J'aimerais beaucoup, mais c'est l'hôte de mon client .. – FutureCake

+1

Si c'est trop grand, commencez à chunking! :-) Vous pouvez couper le fichier en morceaux de petite taille et les ajouter à un fichier avec fwrite. –

Répondre

1

Alors comme dit dans les commentaires. Le matériel de référence est sous les exemples de code. Astuce consiste à couper le fichier en morceaux qui sont inférieurs à la limite de téléchargement. Cette méthode peut être étendue au point que lorsqu'un téléchargement de fichier est interrompu, vous pouvez continuer sur la dernière partie connue. :-)

Classe JavaScript de base pour aider à télécharger le fichier, détermine les morceaux à envoyer à un serveur 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(); 
    }; 
} 

Et pour le bit PHP:

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

avertissement Big ici, assurez-vous de valider correctement et prendre des mesures de sécurité pour assurer la sécurité de vos clients fonction télécharger. Vous écrivez l'entrée PHP brute dans un fichier.

Lorsque le téléchargement est terminé, vous pouvez renommer le fichier en son nom d'origine, y compris l'extension correcte.

Documents de référence:
http://creativejs.com/tutorials/advanced-uploading-techniques-part-1/index.html
https://secure.php.net/manual/en/wrappers.php.php

En bref .. il est briser le fichier en petits morceaux à l'aide d'un processeur, télécharger les fichiers en utilisant des méthodes conventionnelles (comme vous le feriez normalement télécharger un fichier), append l'entrée dans un fichier temporaire. Certains pièges que j'ai rencontrés envoyaient des paramètres supplémentaires et similaires au point de terminaison, évitez ceux qui sont ajoutés au fichier et cela corrompra votre fichier.

+1

merci beaucoup cela aide beaucoup! – FutureCake