Html File Save – Cómo superar el límite de 2K en GET. (Nota POST no funciona)

Estoy guardando un archivo construido en javascript en el directorio local de descargas de internet.

Esto funciona:

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; 

Esto no lo hace:

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; 

Obviamente, esto no funciona debido al límite de 2K en la url.

El error es:

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

Obviamente necesitas usar POST, pero ¿cómo lo haces con POST? ¿Cómo se hace el bit ‘document.location =’ con datos POST? No puedes hacer un POSTE ajax, (ver más abajo), lo he intentado y no funciona.

El método POST fallido:

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; 

Entonces, ¿qué puedo hacer para guardar archivos de más de 2K?

php no es necesario para crear, solicita al usuario que guarde el archivo creado en javascript . Puede usar el elemento con el atributo de download configurado en filename de filename , href establecido en objectURL de Blob contiene datos de archivo para iniciar la solicitud de que el usuario guarde el archivo.

Si desea utilizar php , puede utilizar php://input , file_get_contents() , echo POST ed Blob o File object.

 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();