Текст из JavaScript отправить как файл локально самому себе
Попытка была такой : в JavaScript нарисовал текст, его записал в скрытый <textarea> на странице. Форме <form method=post id="form_id"> отправил событие document . forms [ 'form_id' ] . submit ( ) ;. Страница обновилась и запустился процесс отправки файла.
index.php
if ( ! isset ( $_SESSION [ 'flagfinishfilepingpong' ] ) or
$_SESSION [ 'flagfinishfilepingpong' ] === false ) {
if ( isset ( $_POST [ 'filename_name' ] ) ) {
$shifr -> filename = $_POST [ 'filename_name' ] ;
unset ( $_POST [ 'filename_name' ] ) ; }
if ( isset ( $_POST [ 'boxes_info' ] ) ) {
$shifr -> boxes_info = $_POST [ 'boxes_info' ] ;
unset ( $_POST [ 'boxes_info' ] ) ;
if ( $shifr -> boxes_info ) {
include ( './post_file.php' ) ;
exit ; } } }
post_file.php
<?php
$_SESSION [ 'flagfinishfilepingpong' ] = true ;
$_SESSION [ 'postfilefopenerror' ] = false ;
$_SESSION [ 'postfilefwriteerror' ] = false ;
$_SESSION [ 'postfilefcloseerror' ] = false ;
$_SESSION [ 'postfilenotexisterror' ] = false ;
$uploadfileshi = tempnam ( "/tmp" , "shi" ) ;
$fpw = fopen ( $uploadfileshi , 'wb' ) ;
if ( $fpw === false ) {
$_SESSION [ 'postfilefopenerror' ] = $uploadfileshi ;
exit ; }
if ( fwrite ( $fpw , $shifr -> boxes_info ) === FALSE ) {
$_SESSION [ 'postfilefwriteerror' ] = $uploadfileshi ;
exit ; }
if ( fclose ( $fpw ) === false ) {
$_SESSION [ 'postfilefcloseerror' ] = $uploadfileshi ;
exit ; }
if ( file_exists ( $uploadfileshi ) === false ) {
$_SESSION [ 'postfilenotexisterror' ] = $uploadfileshi ;
exit ; }
header ( 'Content-Description: File Transfer' ) ;
header ( 'Content-Type: application/octet-stream' ) ;
header ( 'Content-Disposition: attachment; filename="' .
basename ( $shifr -> filename ) . '.shi"' ) ;
header ( 'Expires: 0' ) ;
header ( 'Cache-Control: must-revalidate' ) ;
header ( 'Pragma: public' ) ;
header ( 'Content-Length: ' . filesize ( $uploadfileshi ) ) ;
readfile ( $uploadfileshi ) ;
exit ;
?>
Отправка файла происходит пинг-понгом нормально, но останавливается страница. И на любые нажатия кнопок происходит повторная передача файла. И опять стоп и всё по-новой. Лечиться только грубым ручным перезапуском страницы.
Где ошибка? Как минимально подправить этот процесс? Какой другой способ есть для отправки файла самому себе, не используя сторонние библиотеки. Только чистый PHP и JavaScript.
Ответы (1 шт):
Результат отправки файла не имеет ответа от сервера. А обновление страницы не видит изменения переменных сессии $_SESSION [ 'flagfinishfilepingpong' ]. И нажатие кнопки чтобы отправить файл приводит к потере связи с сервером. Решил вопрос так : убрал прямой вызов отправки файл из главной страницы. Поставил индивидуальную реакцию на разные кнопки. На простую кнопку реакция стандартная, а на специальную кнопку - вызов отправки и приёма файла без ожидания ответа. Страница не обновляется, но нет остановки другой работы. Вот тестовая страница, для проверки :
test_index.php :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>EncryptTextToFile</title>
</head>
<body>
<form method="post" id="id_form" >
Filename :<br>
<textarea name="name_filename" id="id_filename"></textarea><br>
Text :<br>
<textarea name="name_text" id="id_text"></textarea><br>
<input type="submit" value="Nothing" id="id_butt" >
<input type="submit" value="Encrypt" id="id_encrypt" >
<textarea name="name_encryptedtext" id="id_encryptedtext" readonly hidden ></textarea>
</form>
<script>
function post_encrypt() {
let text = document . getElementById ( 'id_text' ) ;
let enctext = document . getElementById ( 'id_encryptedtext' ) ;
enctext . value = 'Encrypted ( ' + text . value + ' )' ;
document . forms [ 'id_form' ] . action = 'test_file.php' ;
document . forms [ 'id_form' ] . submit ( ) ; }
function post_main() {
let text = document . getElementById ( 'id_text' ) ;
let enctext = document . getElementById ( 'id_encryptedtext' ) ;
enctext . value = 'Другая работа ( ' + text . value + ' )' ;
document . forms [ 'id_form' ] . action = 'test_index.php' ;
document . forms [ 'id_form' ] . submit ( ) ; }
let el = document.getElementById("id_butt");
el.addEventListener("click", post_main, false);
let ele = document.getElementById("id_encrypt");
ele.addEventListener("click", post_encrypt, false);
</script>
</body>
</html>
test_file.php :
<?php
$path = sys_get_temp_dir();
$uploadfileshi = tempnam($path, "shi");
if(!($fpw = fopen($uploadfileshi, 'w+'))){
exit;}
if( ! fwrite($fpw, $_POST['name_encryptedtext'])){
exit;}
if(!fclose($fpw)){
exit;}
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($_POST['name_filename']) .
'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($uploadfileshi));
readfile($uploadfileshi);
?>