2016-07-30 37 views
2

Ich speichere eine Datei, die in Javascript erstellt wurde, in das lokale Verzeichnis für Internet-Downloads.Html File Save - Wie man die 2K Grenze auf GET zu überwinden. (Hinweis: POST funktioniert nicht)

Dies funktioniert:

Javascript

var filename = "mysave.txt" 
var contents = "xyz"; 
document.location = "htmlsave.php?filename=" + filename + "&contents=" + contents; 

htmlsave.php:

if(!isset($_GET)) { 
    exit(0); 
} 
$filename = $_GET['filename']; 
$contents = $_GET['contents']; 

header("Pragma: public"); // required 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private", false); // required for certain browsers 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=\"" . $filename . "\";"); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: " . strlen($contents)); 
header("Connection: close"); 
echo $contents; 

Dies gilt nicht:

javascript:

var i; 
var filename = "mysave.txt" 
var contents = ""; 
for(i=0, contents = "";i<10000;i++){ 
    contents += "x"; 
} 
document.location = "htmlsave.php?filename=" + filename + "&contents=" + contents; 

Dies funktioniert offensichtlich nicht wegen der 2K Grenze auf der URL.

Der Fehler ist:

Request-URI Too Long 
The requested URL's length exceeds the capacity limit for this server. 

Natürlich müssen Sie POST verwenden, aber wie wollen Sie tun es mit POST? Wie machst du das 'document.location =' Bit mit POST-Daten? Du kannst keinen Ajax-POST machen (siehe unten), ich habe es versucht und es funktioniert nicht.

Die gescheiterte POST-Methode:

javascript:

var filename = "mysave.txt" 
var contents = ""; 
for(i=0, contents = "";i<10000;i++){ 
    contents += "x"; 
} 
dataARR = { 
    filename: filename, 
    contents: contents 
}; 
var dataJSON = JSON.stringify(dataARR); 
$.ajax({ 
    type: "POST", // This for array 
    url: "htmlsave.php", 
    async: true, 
    cache: false, 
    crossDomain: false, // This needs to be true for other people 
    data: { myJson: dataJSON }, 

    success: function (data) { 
    }, 
    error: function (XMLHttpRequest, textStatus, errorThrown) { 
    } 
}); 

htmlsave.php

if(!isset($_POST) || !isset($_POST['myJson'])) { 
    exit(0); 
} 
$dataTotal = json_decode($_POST['myJson'], true); 
$filename = $dataTotal['filename']; 
$contents = $dataTotal['contents']; 

header("Pragma: public"); // required 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private", false); // required for certain browsers 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=\"" . $filename . "\";"); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: " . strlen($contents)); 
header("Connection: close"); 
echo $contents; 

Also, was kann ich tun, Dateien speichern mehr als 2K?

+0

enthalten sein Nicht sicher, was Sie versuchen zu erreichen? – guest271314

+0

Ich möchte eine Javascript-Datei, größer als 2K, im Downloadverzeichnis des Clients speichern. – Rewind

+0

Sie können dies erreichen, ohne 'php' zu verwenden – guest271314

Antwort

1

php muss nicht erstellt werden, Benutzer wird aufgefordert, die unter javascript erstellte Datei zu speichern. Sie können <a> Element mit download Attribut auf filename, href festgelegt auf objectURL von Blob mit Dateidaten verwenden, um die Eingabeaufforderung für Benutzer zum Speichern der Datei zu initiieren.

Wenn Sie php verwenden möchten, können Sie php://input, file_get_contents(), echoPOST ed Blob oder File Objekt nutzen.

var i; 
 
var filename = "mysave.txt" 
 
var contents = ""; 
 
for(i=0, contents = "";i<10000;i++){ 
 
    contents += "x"; 
 
} 
 

 
var data = new Blob([contents], {type:"text/plain"}); 
 
var file = URL.createObjectURL(data); 
 
var a = document.createElement("a"); 
 
a.download = filename; 
 
a.href = file; 
 
a.click();


Mit file_ge_contents(), php://input

JavaScript

var i; 
var filename = "mysave.txt" 
var contents = ""; 
for(i=0, contents = "";i<10000;i++){ 
    contents += "x"; 
} 

var data = new Blob([contents], {type:"text/plain"}); 

var request = new XMLHttpRequest(); 
request.open("POST", "/path/to/server"); 
request.setRequestHeader("x-file-name", filename); 
request.reponseType = "blob"; 
request.onload = function() { 
    console.log(this.response); // `echo`ed file 
}; 
request.send(data); 

php

echo file_get_contents("php://input"); 

Siehe auch Generate png-file with php from dataURI sent through ajax; obwohl die Notiz request.setRequestHeader("x-file-name", filename); sollte unter javascript Teil der Antwort für $tmpFilename = $_SERVER["HTTP_X_FILE_NAME"]; bei php

+0

Das sieht gut aus, aber es leitet mich zum App Store. Zuerst fragt es: "Möchten Sie dieser Website erlauben, eine Anwendung auf Ihrem Computer zu öffnen?" Dann leitet es mich zum App Store, auf der Suche nach etwas, das Blobs lesen kann. – Rewind

+0

@Rewind _ "Das sieht gut aus, aber es leitet mich zum App Store. Zuerst fragt es," Willst du dieser Website erlauben, eine Anwendung auf deinem Computer zu öffnen? "Dann leitet es mich zum App Store etwas, das Blobs lesen kann. "_ Interessant. Welchen Browser benutzen Sie? – guest271314

+0

Im Internet Explorer 11 wird nach dem App Store gefragt. Firefox mag deine Methode überhaupt nicht, es tut einfach nichts. Auf Chrome funktioniert es perfekt. – Rewind