Я сохраняю файл, созданный в javascript, в каталог локальных интернет-каталогов.
Это работает:
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;
Это не означает:
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;
Это явно не работает из-за ограничения 2K на URL.
Ошибка:
Request-URI Too Long The requested URL's length exceeds the capacity limit for this server.
Очевидно, вам нужно использовать POST, но как вы это делаете с помощью POST? Как вы выполняете бит document.location = с данными POST? Вы не можете сделать ajax POST (см. Ниже), я пробовал, и он не работает.
Сбой метода POST:
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;
Итак, что я могу сделать, чтобы сохранить файлы размером более 2K?
php
не требуется для создания, подскажите пользователю сохранить файл, созданный в javascript
. Вы можете использовать элемент <a>
с атрибутом download
установленным в filename
, href
установленным в objectURL
из Blob
содержащим данные файла, чтобы инициировать запрос для сохранения файла пользователем.
Если вы хотите использовать php
вы можете использовать php://input
, file_get_contents()
, echo
POST
ed Blob
или 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();