web-dev-qa-db-fra.com

Transférer des fichiers de 1 Go en utilisant la segmentation PHP

J'ai une application Web qui accepte les téléchargements de fichiers allant jusqu'à 4 Mo. Le script côté serveur est PHP et le serveur Web est NGINX. De nombreux utilisateurs ont demandé d'augmenter considérablement cette limite afin de permettre le téléchargement de vidéos, etc.

Cependant, il semble qu'il n'y ait pas de solution facile à ce problème avec PHP. Premièrement, du côté du client, je recherche quelque chose qui me permettrait de couper des fichiers pendant le transfert. SWFUpload ne semble pas faire cela. Je suppose que je peux diffuser du contenu en utilisant Java FX ( http://blogs.Oracle.com/rakeshmenonp/entry/javafx_upload_file ) mais je ne trouve aucun équivalent de request.getInputStream en PHP. 

Augmenter les limites du navigateur client_post ou le téléchargement php.ini ou max_execution fois n'est pas vraiment une solution pour les fichiers très volumineux (~ 1 Go) car le navigateur va peut-être expirer et penser à toutes les blobs stockées en mémoire.

Existe-t-il un moyen de résoudre ce problème en utilisant PHP côté serveur? J'apprécierais vos réponses.

36
rjha94

plupload est une bibliothèque javascript/php, très facile à utiliser et qui permet le chunking.

Il utilise HTML5 si.

10
Dean Rather

J'ai créé un client JavaFX pour envoyer des fichiers volumineux en morceaux de taille maximale (j'utilise 2 Mo) et un script récepteur PHP pour assembler les morceaux en fichier d'origine. Je publie le code sous licence Apache ici: http://code.google.com/p/gigaupload/ N'hésitez pas à utiliser/modifier/distribuer.

3
rjha94

"mais je ne trouve aucun équivalent de request.getInputStream en PHP."

fopen('php://input'); peut-être?

3
Bart van Heukelom

Essayez d’utiliser la variable bigupload script. Il est très facile à intégrer et peut télécharger jusqu'à 2 Gb en morceaux. La taille du bloc est personnalisable. 

2
Amjad Farooq

Jetez un coup d'œil à tus protocol qui est un protocole basé sur HTTP pour les téléchargements de fichiers pouvant être repris afin que vous puissiez continuer là où vous l'avez laissé sans re-télécharger à nouveau des données entières en cas d'interruption. Ce protocole a également été adopté par vimeo à partir de mai 2017. 

Vous pouvez trouver différentes implémentations du protocole dans différentes langues ici . Dans votre cas, vous pouvez utiliser son client javascript appelé uppy et utiliser golang ou php basé sur un serveur.

1
Konsole

Pourquoi ne pas utiliser un applet Java pour le téléchargement et PHP pour le traitement ..

Vous pouvez trouver ici un exemple pour Jupload: http://sourceforge.net/apps/mediawiki/jupload/index.php?title=PHP_Example

0
Chris

vous pouvez utiliser ce paquet

il prend en charge le téléchargement de morceaux pouvant être repris.

dans l'exemple exemples/js-exemples/resumable-chunk-upload, vous pouvez fermer et rouvrir le navigateur, puis reprendre les téléchargements non terminés.

0
Mahdi