DOM создавал скриншоты в виде файлов PNG

#javascript #php #html2canvas

#javascript #php #html2canvas

Вопрос:

Я использую html2canvas.js для создания скриншота веб-страницы. Единственное, я не знаю, как перенести эти данные в формат файла изображения, чтобы я мог сохранить их и связать в базе данных.

Это мой текущий код:

 <script language="Javascript">
    setInterval(function() {
        html2canvas(document.body, {
            onrendered: function(canvas2) {
                context.drawImage(video, 0, 0, 240, 180);
                $.post(
                    "' . self::get_link('save_screenshots') . '",
                    "user_id=' . module_security::get_loggedin_id() .
                    'amp;screenshot="   encodeURI(canvas2.toDataURL())
                );
                document.body.appendChild(canvas2)
            }
        })
    }, 1*60*1000);
</script>
  

Комментарии:

1. После ввода toDataURL («изображение / png») вы получите данные в формате base64. Вы имеете в виду, как обрабатывать эти данные base64 на стороне сервера?

2. Да, первоначальная идея заключалась в том, чтобы запустить данные base64 с помощью PHP-скрипта и загрузить их в базу данных.

3. но если это невозможно, я хотел бы сохранить данные в виде файла .png и сохранить их в каталоге изображений со ссылкой на базу данных.

4. Это возможно, но я не думаю, что хранить данные изображения в базе данных — это своего рода лучшая практика. Поэтому я предлагаю сохранить его в каталоге изображений.

Ответ №1:

Это может помочь вам:

 <?php
    // requires php5
    define('UPLOAD_DIR', 'your/images/directory/');
    $img = $_POST['img'];
    $img = str_replace('data:image/png;base64,', '', $img);
    $img = str_replace(' ', ' ', $img);
    $data = base64_decode($img);
    $img_file = UPLOAD_DIR . uniqid() . '.png';
    $success = file_put_contents($img_file, $data);
    if($img_file){
        // store the link to database
    } else{
       //return error msg
    }

?>
  

Ответ №2:

Вы должны позволить jQuery обрабатывать кодировку запроса за вас:

 $.post(url, {
    user_id: 123,
    screenshot: canvas2.toDataURL()
}, function() {
    // success
    document.body.appendChild(canvas2);
});
  

Затем вы декодируете их подобным образом на стороне сервера:

 $data = base64_decode(substr(
    $_POST['screenshot'], 
    strpos($_POST['screenshot'], ',')   1
));
  

Комментарии:

1. Я не совсем понимаю ваш пост. Не могли бы вы объяснить это немного подробнее, пожалуйста?

2. @jfh6 Какую часть вы не понимаете?

3. @jfh6 Ну, значение canvas2.toDataURL() кодируется jQuery, чтобы убедиться, что случайно не превратится в пробелы … он использует encodeURIComponent() внутренне… тело запроса будет выглядеть как «user_id=123amp;screenshot=data:image/png;base64,<данные>».

4. О, хорошо, я не знал, что jquery сделал это внутренне. Спасибо за информацию. Я не могу проголосовать за ваш пост, потому что у меня низкая репутация в stack overflow, иначе я бы сделал это, спасибо за этот полезный совет.