Frage

Ich möchte Uploads von sehr großen Dateien in unsere PHP-Anwendung ermöglichen (hundert MB - 8 Konzerte). Es gibt ein paar Probleme mit diesem jedoch.

Browser:

  • HTML-Uploads crappy Feedback haben, müssen wir für den Fortschritt entweder Umfrage (die ein bisschen albern ist) oder zeigen keine Rückmeldung an allen
  • Flash-Uploader gesamte Datei in den Speicher setzt, bevor das Hochladen
  • Start

Server:

  • PHP zwingt uns post_max_size zu setzen, die in einem leicht verwertbaren DoS-Angriff führen könnten. Ich möchte nicht global diese Einstellung setzen.
  • Der Server benötigt auch einige andere Variablen in den POST Vars, dort zu sein, wie ein geheimer Schlüssel. Wir möchten, dass die Anfrage sofort verweigern zu können, statt, nachdem die gesamte Datei hochgeladen wird.

Anforderungen:

  • HTTP ist ein Muss.
  • Ich bin flexibel mit clientseitige Technologie, solange es in einem Browser funktioniert.
  • ist PHP keine Voraussetzung, wenn es eine andere Technik ist, die gut auf einer Linux-Umgebung arbeiten, das ist vollkommen cool.
War es hilfreich?

Lösung

Wie über ein Java-Applet? Das ist, wie wir es bei einem Unternehmen zu tun hatten, denn ich vorher gearbeitet. Ich weiß, dass Applets saugen, vor allem in der heutigen Zeit mit all unseren Möglichkeiten, aber sie sind wirklich die vielseitigste Lösung für Desktop-ähnliche Probleme in Web-Entwicklung begegnet. Nur etwas zu betrachten.

Andere Tipps

upload_max_filesize kann so eingestellt werden auf einer per- Verzeichnis Basis ; das gleiche gilt für post_max_size

z.

<Directory /uploadpath/>
  php_value upload_max_filesize 10G
  php_value post_max_size 10G
</IfModule>

Python Handler?

ein Python-POST-Handler anstelle von PHP. Generieren Sie eine eindeutige Kennung von PHP-Anwendung, die der Client in den HTTP-Header setzen. Mit Mod_python abzuweisen oder den großen Upload zu akzeptieren, bevor die gesamten POST Körper übertragen wird.

Ich denke, http://www.modpython.org/live/current /doc-html/dir-handlers-hph.html

Hier können Sie Header prüfen und den Rest des POST Eingang sinken. Ich habe es nicht ausprobiert, aber vielleicht der richtige Weg sein?

Mit Blick auf der Quelle von mod_python, scheint die Pufferung des Eingangs über read () Bit-at-a-time Auswertung der HTTP-Eingabe zu ermöglichen. Header sind zuerst.

https://svn.apache.org/ repos / asf / quetzalcoatl / mod_python / trunk / src / filterobject.c

Es ist alt ich weiß, aber vielleicht hat jemand dieses Problem nowdays haben, auch. Jetzt können Sie dies mit nur Javascript und, sagen wir, PHP. Kein Flash oder Java auf Client-Seite erforderlich.

Demo: http://dnduploader.filkor.org/

Die Idee ist, die Dateien mit Javascripts Blob Methode slice () zu schneiden ...

Sie können die post_max_size Set für nur Skripte in 1 Verzeichnis. Zeigen Sie Upload-Skript gibt, und lassen nur das Skript große Größen zu handhaben. Es ist immer noch möglich, dass Skript mit großen / nutzlosen Dateien angegriffen werden, aber es vermeidet es global zu setzen.

Verwenden Sie das mit APC und Sie könnten in der Lage sein zu arbeiten, etwas Gutes: IBM Developer arbeitet Artikel über APC

all dies Versuchte ... dies ist bei weitem das beste, das ich verwendet habe noch ...

http://www.uploadify.com/

Hier finden Sie aktuelle jumploader.com

Ein gutes Java-Applet für das Hochladen.

Ich habe es für das Hochladen von Bildern verwendet und es funktioniert gut. Haben Sie nicht mit größeren Dateien als 10 MB versucht, aber ich sollte auch für wirklich große Dateien.

Haben Sie in mit APC sah den Fortschritt und die Gesamtgröße der Datei zu überprüfen. Hier ist eine gute Blog-Post darüber. Es könnte helfen.

Vielleicht könnten Sie Webdav und Javascript in Ihrem Browser verwenden

AJAX Big-Datei-Upload, mit dem Fortschritt, auf WebDAV

http://www.webdavsystem.com/ajax/programming/upload_progress

Eine einfache Bibliothek

http://debris.demon.nl/projects/davclient js / doc / README.html

Sie können dann bekommen die JS den Benutzer zu einer Erfolgsseite zu umleiten. Geheime Schlüssel und was nicht in einem PHP Vorspiel behandelt werden, bevor der JS-Client-> WebDAV Handoffs

Ich würde schauen Sie in FTP, SSH oder SCP dies ermöglicht es Ihnen, eine große Datei zu laden und nach wie vor Zugang haben die Kontrolle über die auch Datei. Dies könnte etwas länger dauern zu implementieren, aber es ist wahrscheinlich die sicherste Art und Weise kann ich mir vorstellen.

Ich habe Erfolg gehabt mit Uploadify , und ich würde es empfehlen. Es ist ein jQuery / Flash-Skript, das große Uploads Griffe, und Sie zusätzliche Parameter, um es (wie die geheimen Schlüssel) passieren kann. Um die serverseitige Probleme zu lösen, einfach den folgenden Code verwenden. Die Änderungen werden nur für das Skript beeinflussen sie in genannt werden:

//Check to see if the key is there
if(!isset($_POST['secret_key']) || !isValid($_POST['secret_key']))
{
    exit("Invalid request");
}
function isValid($key)
{
    //Put your validation code here.
}

//This line changes the timeout.
//Give it a value in seconds (3600 = 1 hour)
set_time_limit(3600);

//Set these amounts to whatever you need.
ini_set("post_max_size","8192M");
ini_set("upload_max_filesize","8192M");

//Generally speaking, the memory_limit should be higher
//than your post size.  So make sure that's right too.
ini_set("memory_limit","8200M");

Bearbeiten In Antwort auf Ihren Kommentar:

Nach dem, was Sie gesagt haben, ich fürchte, Sie nicht in der Lage sein können Ihre Anforderungen über HTTP zu erfüllen. Alle Lösungen da draußen ist Code, Funktionen http hinzufügen, dass es nie entworfen wurde.

Wie Sie selbst gesagt, es ist ein einfaches Protokoll. Abgesehen von Ihrer eigenen Client-Software zu schreiben, die außerhalb des Browsers ausgeführt wird, ein Java-Applet oder ein anderes Protokoll (wie FTP, die dafür entworfen wurde), könnte man nicht bekommen, was Sie wollen.

Ich habe das Beste getan, was ich in den gegebenen Randbedingungen konnte. Leider kann ich nicht besser machen.

Ich weiß, es saugt eine andere Abhängigkeit hinzufügen, aber in meiner Erfahrung, die meisten Websites, die so etwas wie dies verwenden Blitz auf der Client-Seite, und das Hochladen die große Datei als chunks

tun

Adobe als howto auf Flash-Datei-Uploads

Ich fand auch dieses Tutorial auf Codeproject:

Multiple File Upload mit Fortschrittsbalken die Verwendung von Flash und ASP.NET

PS - Ich weiß, dass Sie PHP verwenden und nicht .net, ich dachte, der wichtige Teil war der Blitz;)

Versuchen Sie folgende: http://www.simple2ftp.com verwendet ein Java-basiertes FTP-Applet aus einem cleveren PHP Anwendungswrapper.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top