Как сделать ajax Post, не открывая страницу

Я пытаюсь создать URL-адрес публикации Ajax, используя toDataURL, ajax-вызов выполняется в test.php. У меня включена функция сохранения save.php. Моя проблема в том, что изображение можно сохранить, если я сначала открою test.php , тогда изображение появится в моем каталоге. Я хочу сохранить изображение при открытии save.php. Возможно ли это сделать?

test.php

function submitdata(){
var canvas = document.getElementById('chart1');
var imgData = canvas.toDataURL('image/png', 1);

        $.ajax({
            type: "POST", 
            url: "save.php",
            data: { imgData: imgData },
            success: function(response) {
            console.info(response);
            }
        });
}
$(document).ready(function() {
    submitdata();
}); 

save.php

function save_base64_image($base64_image_string, $output_file_without_extension, $path_with_end_slash = "" ) {

    $splited = explode(',', substr( $base64_image_string , 5 ) , 2);
    $mime=$splited[0];
    $data=$splited[1];

    $mime_split_without_base64=explode(';', $mime,2);
    $mime_split=explode('/', $mime_split_without_base64[0],2);
    if (count($mime_split)==2)
    {
        $extension=$mime_split[1];
        if ($extension=='jpeg')$extension='jpg';
        $output_file_with_extension=$output_file_without_extension.'.'.$extension;
    }
    file_put_contents( $path_with_end_slash . $output_file_with_extension, base64_decode($data) );
    return $output_file_with_extension;
}

$image = $_POST['imgData'];

$path='images/chart_1';

save_base64_image($image, $path, $path_with_end_slash = "" );

Я тоже пытаюсь использовать эту функцию

function save_base64_image($base64_image_string, $output_file_without_extension, $path_with_end_slash = "" ) {

    $splited = explode(',', substr( $base64_image_string , 5 ) , 2);
    $mime=$splited[0];
    $data=$splited[1];

    $mime_split_without_base64=explode(';', $mime,2);
    $mime_split=explode('/', $mime_split_without_base64[0],2);
    if (count($mime_split)==2)
    {
        $extension=$mime_split[1];
        if ($extension=='jpeg')$extension='jpg';
        $output_file_with_extension=$output_file_without_extension.'.'.$extension;
    }
    file_put_contents( $path_with_end_slash . $output_file_with_extension, base64_decode($data) );
    return $output_file_with_extension;
}

$image = $_POST['imgData'];

$x1=   chr(rand(0,25)+97) ;
$x2=   chr(rand(0,25)+97) ;
$x3=   chr(rand(0,25)+97) ;
$x4=   chr(rand(0,9)+48) ;
$x5=   chr(rand(0,9)+48) ;

$path = 'images/';
$filename = $path . 'chart1_' . $x1 . $x2 . $x3 . $x4 . $x5.'.png';

save_base64_image($image, $path, $filename);

мое изображение сохраняется, когда я открываю save.php, но мое изображение ничего не содержит (пусто).

твой вопрос неясен

Abhishek Kumar 09.05.2024 07:58

какая часть неясна?

Unknown 09.05.2024 08:02

@Неизвестно, если я правильно понял ваш вопрос, вы открываете save.php напрямую (без вызова Ajax). Если вы это сделаете, в вашу функцию save_base64_image ничего не будет отправлено (поскольку $_POST['imgData'] будет иметь значение null).

William Carneiro 09.05.2024 08:06

Да, это. Итак, есть ли у вас какие-либо предложения, как с этим справиться? Потому что я хочу напрямую открыть страницу, где находится функция save_base64_image.

Unknown 09.05.2024 08:10

Логика кода save.php заключается в том, чтобы перехватить содержимое $_POST['imgData'] и сохранить файл изображения. Если вы откроете save.php напрямую, ничего не будет отправлено. Единственный способ использовать этот файл с прямым доступом — изменить переменную $_POST на $_GET и отправить содержимое изображения в качестве параметра (например, save.php?imgData=img-base64).

William Carneiro 09.05.2024 08:14

Итак, правда ли, что ваша главная цель — использовать одну страницу PHP (вместо двух страниц) для выполнения всего процесса сохранения холста?

Ken Lee 10.05.2024 02:20

@KenLee, это правда. Но поскольку сделать это невозможно, я попробую другой способ.

Unknown 10.05.2024 03:14

Это возможно (я думаю, есть по крайней мере два метода), объединив две страницы вместе.

Ken Lee 10.05.2024 03:41

Если возможно, подскажите, как это сделать. Что вы подразумеваете под объединением двух страниц?

Unknown 10.05.2024 03:57

Привет @Unknown, см. мой ответ ниже (показан код двух методов)

Ken Lee 10.05.2024 07:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
10
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вашей основной целью является «сохранение изображения» холста, но по каким-то особым причинам вы не хотите использовать две отдельные страницы (одну HTML и одну PHP), мы можем объединить необходимые функции в один файл PHP. который выполняет оба следующих действия

  1. создание холста
  2. сохранение файла изображения

Есть два немного разных метода сделать вышеперечисленное: один использует ajax, а другой нет.

Для обоих методов будет создан и сохранен файл PNG в папке, известной как «изображения», поэтому убедитесь, что эта папка у вас есть, и убедитесь, что система доступна для записи в эту папку.

Способ 1 — использовать ajax (вызов самого себя)

Имя PHP: saveimagecanvas1.php

<?php

function save_base64_image($base64_image_string, $output_file_without_extension, $path_with_end_slash = "" ) {

    $splited = explode(',', substr( $base64_image_string , 5 ) , 2);
    $mime=$splited[0];
    $data=$splited[1];

    $mime_split_without_base64=explode(';', $mime,2);
    $mime_split=explode('/', $mime_split_without_base64[0],2);
    if (count($mime_split)==2)
    {
        $extension=$mime_split[1];
        if ($extension=='jpeg')$extension='jpg';
        $output_file_with_extension=$output_file_without_extension.'.'.$extension;
    }
    file_put_contents( $path_with_end_slash . $output_file_with_extension, base64_decode($data) );
    return $output_file_with_extension;
}

if ($_POST['imgData']! = "") {

$image = $_POST['imgData'];

$x1=   chr(rand(0,25)+97) ;
$x2=   chr(rand(0,25)+97) ;
$x3=   chr(rand(0,25)+97) ;
$x4=   chr(rand(0,9)+48) ;
$x5=   chr(rand(0,9)+48) ;

$path = "./images/".$x1.$x2.$x3.$x4.$x5;

save_base64_image($image, $path, $path_with_end_slash = "" );

echo "Image saved - inside the 'images' folder " .$path ;
exit();
}

?>


<script
  src = "https://code.jquery.com/jquery-3.7.1.js"
  integrity = "sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4 = "
  crossorigin = "anonymous"></script>


<div id=ajaxreturn></div>

<canvas id = "chart1" width = "200" height = "100" >

<script>
   var c = document.getElementById("chart1");
   var ctx = c.getContext("2d");
   ctx.beginPath();
   ctx.arc(95, 50, 40, 0, 2 * Math.PI);
   ctx.stroke();
</script>



<script>

function submitdata() {

   var canvas = document.getElementById('chart1');
   var imgData = canvas.toDataURL('image/png', 1);
  
         $.ajax({
            type: "POST",
            url: "saveimagecanvas1.php",
            data: { imgData: imgData },
            success: function(response) {
               document.getElementById('ajaxreturn').innerHTML=response;
            }
        });
}


window.onload = () => {
  submitdata();
}

</script>



Способ 2 – не используйте ajax, а используйте отправку формы для отправки данных самому PHP.

Имя PHP: saveimagecanvas2.php

<?php

function save_base64_image($base64_image_string, $output_file_without_extension, $path_with_end_slash = "" ) {

    $splited = explode(',', substr( $base64_image_string , 5 ) , 2);
    $mime=$splited[0];
    $data=$splited[1];

    $mime_split_without_base64=explode(';', $mime,2);
    $mime_split=explode('/', $mime_split_without_base64[0],2);
    if (count($mime_split)==2)
    {
        $extension=$mime_split[1];
        if ($extension=='jpeg')$extension='jpg';
        $output_file_with_extension=$output_file_without_extension.'.'.$extension;
    }
    file_put_contents( $path_with_end_slash . $output_file_with_extension, base64_decode($data) );
    return $output_file_with_extension;
}

if ($_POST['imgData']! = "") {

$image = $_POST['imgData'];

$x1=   chr(rand(0,25)+97) ;
$x2=   chr(rand(0,25)+97) ;
$x3=   chr(rand(0,25)+97) ;
$x4=   chr(rand(0,9)+48) ;
$x5=   chr(rand(0,9)+48) ;

$path = "./images/".$x1.$x2.$x3.$x4.$x5;

save_base64_image($image, $path, $path_with_end_slash = "" );

echo "Image saved - inside the 'images' folder " .$path ;

exit();
}

?>


<script
  src = "https://code.jquery.com/jquery-3.7.1.js"
  integrity = "sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4 = "
  crossorigin = "anonymous"></script>


<canvas id = "chart1" width = "200" height = "100" >

<script>
   var c = document.getElementById("chart1");
   var ctx = c.getContext("2d");
   ctx.beginPath();
   ctx.arc(95, 50, 40, 0, 2 * Math.PI);
   ctx.stroke();
</script>



<script>

function submitdata() {

   var canvas = document.getElementById('chart1');
   var imgData = canvas.toDataURL('image/png', 1);
document.getElementById('imgData').value=imgData;
document.getElementById('form1').submit();

}



window.onload = () => {
  submitdata();
}


</script>

<form id=form1 action = "#" method=POST>
<input type=hidden name=imgData id=imgData>
</form>

Примечание. Для демонстрации я нарисовал на холсте круг, чтобы вы могли что-то сохранить в виде изображения, но, конечно, вы можете использовать любой метод для рисования графики на холсте.

Результат:

один файл php создаст файл, известный как bse38.png внутри папки изображений.

Другие вопросы по теме