Zum Inhalt springen

Ziel speichern unter per JavaScript


jasso

Empfohlene Beiträge

Hi Leute,

ich habe einen kleinen Downloadmanager gebastelt bei welchem Benutzergesteuert Dateien hochgeladen, zugewiesen und Heruntergeladen werden.

Mein Problem ist nun dass der Kunde z.B. einige Videodateien hochlädt welche beim klick auf die Datei (Downloadlink) nicht zum Speichern angeboten, sondern im Browser geöffnet werden. Kann ich das irgendwie umgehen und eine art "Ziel Speichern unter" Funktion ausführen?

danke

lg

jasso

Link zu diesem Kommentar
Auf anderen Seiten teilen

hmmm ... klappt eigentlich fast perfekt:

<?
$filename="irgendwas.mpg";
header("Content-Type: application/x-octet-stream");
header("Content-Length: " . filesize($filename));
header("Content-Disposition: attachment, filename='" . $filename . "');
echo filename_get_contents($filename);
?>[/PHP]

nur leider benennt er mir die downzuloadende Datei immer nach dem PHP-File (in diesem fall "test.php"). kann ich das noch irgendwie abschalten?

lg

jasso

Link zu diesem Kommentar
Auf anderen Seiten teilen

nur leider benennt er mir die downzuloadende Datei immer nach dem PHP-File (in diesem fall "test.php"). kann ich das noch irgendwie abschalten?

Was heißt er beendet die Datei?

Meinst du eine Umleitung auf eine andere Seite? Das geht so nicht, Aber ein Link auf deine test.php und die in einem neuen Fenster öffnen sollte doch dann bei der alten Seite bleiben. Im Normalfall geht dann ja auch kein neues Fenster mehr auf, sondern es kommt nur die "Speichern unter..." Abfrage. (Oder ist das bei FF nur ein PlugIn was das bei mir tut?)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ups... falscher Fehler :D

Das liegt wohl an den einfachen Anführungszeichen in deinem Code.


header("Content-Disposition: attachment, filename=\"" . $filename . "\""); 

EDIT: Wenn du schon mit doppelten in PHP arbeitest:

header("Content-Disposition: attachment, filename=\"$filename\""); 

Bei doppelten werden Variablen aufgelöst ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

jetzt hab ich noch das problem dass ich größere dateien (mehrere hundert MB) damit nicht downloaden kann. ich find in meiner php.ini allerdings keinen eintrag für downloadgrößen:confused: (erscheint mir auch nicht sinnvoll). die downgeloadeten dateien hiermit sind jetzt immer 0kb groß. weiß jemand wo ich hier noch die max downloadgröße einstellen kann?

lg

jasso

Link zu diesem Kommentar
Auf anderen Seiten teilen

weiß jemand wo ich hier noch die max downloadgröße einstellen kann?

Nirgendwo? :confused: (macht ja auch keinen Sinn, denn die Downloadgröße is so groß, wie dein Skript etwas sendet)

Wie gibst du die Datei denn aus? Änder die disposition mal von attachment auf inline, dann siehst du im Browser dierekt die ausgegebenen Daten. (Oder evtl irgendwelche Fehlermeldungen o.ä., die ja sonst mit in die Datei gespeichert werden)

Könnte es sein, dass du in deinem Skript die Datei erst lädst und dann ausgibst? PHP hat eine Speicherbegrenzung, kann also nicht beliebig große Dateien laden (in den Speicher).

EDIT:

Alternativ könnte es noch die Laufzeitbegrenzung sein. Der apache bricht ein Skript ab, wenn es länger läuft als erlaubt. In so einem Fall wäre wohl ein direkter Link besser(?).

Link zu diesem Kommentar
Auf anderen Seiten teilen

ups ... sorry. hab vergessen reinzuschreiben dass das problem gelöst ist. danke trotzdem für die antwort jesterday. mit der speicherbegrenzung liegst du richtig. zusätzlich dazu hat die readfile-funktion bei der von mir verwendeten php-version noch nen kleinen fehler zu welchem ich allerdings ein workaround gefunden habe das recht gut funktioniert. hier mal der code für alle die das selbe problem haben:

<?
function readfile_chunked($filename,$retbytes=true)
{
$chunksize = 1*(1024*1024); // how many bytes per chunk
$buffer = '';
$cnt =0;
// $handle = fopen($filename, 'rb');
$handle = fopen($filename, 'rb');
if ($handle === false)
{
return false;
}
while (!feof($handle))
{
$buffer = fread($handle, $chunksize);
echo $buffer;
if ($retbytes)
{
$cnt += strlen($buffer);
}
}
$status = fclose($handle);
if ($retbytes && $status)
{
return $cnt; // return num. bytes delivered like readfile() does.
}
return $status;
}

$file="..."
header("Content-Type: application/x-octet-stream");
header("Content-Length: " . filesize($file));
header("Content-Disposition: attachment; filename=" . basename($file));
echo readfile_chunked($file);
?>[/PHP]

lg

jasso

Link zu diesem Kommentar
Auf anderen Seiten teilen



<?
function readfile_chunked($filename,$retbytes=true)
{
$chunksize = 1*(1024*1024); // how many bytes per chunk
$buffer = '';
$cnt =0;

if ($handle = fopen($filename, 'rb'))
{
while (!feof($handle))
{
$buffer = fread($handle, $chunksize);
echo $buffer;
if ($retbytes)
{
$cnt += strlen($buffer);
}
}

if (fclose($handle) && $retbytes)
{
return $cnt; // return num. bytes delivered like readfile() does.
}
}
return false;
}

?>
[/PHP]

Mir war grad langweilig und ich hab deinen Code mal bissl optimiert ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Falls Du z.B. Apache als Webserver nutzt und deine Dateien in einem separaten Verzeichnis liegen, könntest du z.B. mittels einer .htaccess Datei den Webserver schon dazu bringen, die Dateitypen als application/octet-stream auszugeben, womit diese auch zum Download angeboten werden.

Beispiel eines solchen .htaccess Eintrags:

AddType application/octet-stream .pdf

Anmerkung am Rande:

Bei dieser (und auch bei deiner PHP Variante) ist es vom Browser abhängig ob er das auch wirklich tut. IE5 unter Windows NT z.B. hat (damals zumindest) dies bei manchen Dateitypen ignoriert und diese trotzdem im Browser angezeigt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Anmerkung am Rande:

Bei dieser (und auch bei deiner PHP Variante) ist es vom Browser abhängig ob er das auch wirklich tut.

Es ist immer vom Client abhängig, wie der die empfangenen Daten verarbeitet ;)

Lynx stellt die Seiten z.B. anders dar als der IE :D

Aber die Methode mit dem Attachment ist die offiziell richtige Methode um dem Client zu signalisieren, das was da kommt soll nicht im Dokument angezeigt werden. Wie der das dann auslegt, darauf hat nur der Cliententwickler einfluß.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es ist immer vom Client abhängig, wie der die empfangenen Daten verarbeitet ;)

Lynx stellt die Seiten z.B. anders dar als der IE :D

[...]

Vollkommen richtig, wollte nur separat darauf aufmerksam machen das dies auch wissentlich falsch gemacht wird/wurde und somit auf den Unterschied zwischen Soll und Ist separat hinweisen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...