【问题标题】:Status code 405 (method not allowed) trying to save canvas into database状态码 405(不允许的方法)试图将画布保存到数据库中
【发布时间】:2021-02-05 01:13:27
【问题描述】:

我目前正在尝试将画布保存到数据库。

程序从画布上预加载的图像开始,然后用户可以在其上绘制并点击“保存”将编辑的画布保存到数据库。我创建了一个 api 文件夹,其中包含 db.php(使用 PDO 连接到数据库)、insertDrawing.php(将编辑的画布保存到数据库)和 viewDrawing(从数据库调用保存的画布)。

我使用 AJAX 将画布发布到数据库中,但是当我运行它时,来自 Inspect Element 的网络控制台显示错误 405(不允许的方法): Console

我已经尝试了几乎所有关于状态 405 的方法,但都无济于事。

这些是我的编码:

window.onload = () => {
    const canvas = document.getElementById('canvas');
    const saveButton = document.getElementById('save');
    const clearButton = document.getElementById('clear');
  
    new Drawing(canvas, saveButton, clearButton);
  };
  
  class Drawing {
    constructor(canvas, saveButton, clearButton) {
      this.isDrawing = false;
  
      canvas.addEventListener('mousedown', () => this.startDrawing());
      canvas.addEventListener('mousemove', (event) => this.draw(event));
      canvas.addEventListener('mouseup', () => this.stopDrawing());
  
      saveButton.addEventListener('click', () => this.save());
      clearButton.addEventListener('click', () => this.erase());
  
      const img = new Image();
      img.src = 'images/bodies.png';
      img.onload = () => {
        const canvas = this.canvas;
        const context = canvas.getContext('2d');
        canvas.width = img.width;
        canvas.height = img.height;
        context.clearRect(0, 0, canvas.width, canvas.height);
        context.drawImage(img, 0, 0);
      };
  
      const rect = canvas.getBoundingClientRect();
  
      this.offsetLeft = rect.left;
      this.offsetTop = rect.top;
  
      this.canvas = canvas;
      this.context = this.canvas.getContext('2d');
  
    }
    startDrawing() {
      this.isDrawing = true;
    }
    stopDrawing() {
      this.isDrawing = false;
    }
    draw(event) {
      if (this.isDrawing) {
        this.context.fillRect(event.pageX - this.offsetLeft, event.pageY - this.offsetTop, 3, 3);
        this.context.fillStyle = "#FF0000";
      }
    }
    save() {
      const imgdata = this.canvas.toDataURL('image/png');
      const a = document.createElement('a');
      // a.href = imgdata;
      // a.download = 'image.png';
      a.click();

      $.ajax({
        type: "post",
        url: 'api/insertDrawing.php',
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        data: imgdata,
      });
    }
    erase(){
        const img = new Image();
        img.src = 'images/bodies.png';
        img.onload = () => {
            const canvas = this.canvas;
            const context = canvas.getContext('2d');
            canvas.width = img.width;
            canvas.height = img.height;
            context.clearRect(0, 0, canvas.width, canvas.height);
            context.drawImage(img, 0, 0);
        };
    }
  }
.container {
  display: flex;
  flex-direction:column;
}
<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="css1.css">
  </head>

  <body>

    <canvas id="canvas" width="600" height="500" style="border: 1px solid;"></canvas>

    <button id="save" type="button">
      Save
    </button>
    <button id="clear" type="button">
      Clear
    </button>
    <!-- <input type="file" id="load" name="avatar" accept="image/png"> -->

    <script src="jquery-3.2.1.min.js"></script>
    <!-- <script src="js1.js"></script> -->
    <script src="trytry.js"></script>

  </body>

</html>

注意:jQuery 3.2.1 已添加为同一文件夹中的 js 文件

而我的 php 文件看起来像这样:

<?php
   header('Content-Type: application/json');
   
   require_once('db.php');

   class Drawing 
   {
      var $image;
   }

   try
   {
      $selectAllDrawing->execute();      
      $row_count = $selectAllDrawing->rowCount(); 
         
      if ($row_count) 
      {
         $data = array();
             
         while($row = $selectAllDrawing->fetch(PDO::FETCH_ASSOC)) 
         {           
            //create Drawing object
            //put std drawing in Model (Drawing Object)
            $drawing = new Drawing();
            $drawing->image = $row['image'];
              
            array_push($data, $drawing);
         }
             
         echo json_encode($data);
         exit;
      } 
      else 
      {
         $data = array();
         echo json_encode($data);
         exit;
      }
   }
   catch(PDOException $e) 
   {
       die('ERROR: ' . $e->getMessage());
   } 
<?php
    require_once('db.php');
    
    $image = $_POST["image"];
    
    //insert into database
    try 
    {
        $insertDrawing->execute(array(
            "image" => "$image", 
        ));
    }
    catch(PDOException $e) 
    {
        $errorMessage = $e->getMessage();
        $data = Array(
            "insertStatus" => "failed",
            "errorMessage" => $errorMessage
        );  
        echo json_encode($data);
        exit;
    }
    
    $data = Array(
        "insertStatus" => "success",
        "image" => $image,
    );
    
    echo json_encode($data);
<?php
    //PDO
    function dbStart($address, $login, $password) 
    {
        try 
        {
            $db = new PDO($address, $login, $password);
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);    
            $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        } 
        catch(PDOException $e) 
        {
            echo 'ERROR: ' . $e->getMessage();
        }   
        
        return $db;
    }

    function prepareDbStatement($db,
                                       &$insertDrawing,
                                       &$viewDrawing
                                       )
    {
        try 
        {       
            $insertContactStmt = $db->prepare("INSERT INTO drawing(image) VALUES (:image)");        
            
            $selectAllContactsStmt = $db->prepare('SELECT * FROM drawing
                                                            ORDER BY image ASC'); 
        } 
        catch(PDOException $e) 
        {
            echo 'ERROR: ' . $e->getMessage();  
        }   
    }

    $address = 'mysql:host=localhost;dbname=draw;charset=utf8';
    $login = "root";
    $password = "";
    $db = null;
    $db = dbStart(  $address, 
                    $login, 
                    $password);
                  
    $insertDrawing = null;
    $viewDrawing = null;
        
    //*                
    prepareDbStatement($db,
                           $insertDrawing,
                           $viewDrawing);
    //*/

欢迎回复。非常感谢。

【问题讨论】:

  • 您的服务器端不允许使用“POST”方法,也许服务器端日志中有一些内容可以显示更多信息
  • 你确定它是你在 5500 端口上运行的 PHP 服务器吗?
  • HTTPmetgods 通常使用大写字母,即"POST" 而不是"post"。这不会导致问题吗?
  • 我已将“post”更改为“POST”,但仍然无济于事。当我从 VSCode 中的 HTML 文件中单击“使用 Live Server 打开”时,将获得端口 5500。它不是正确的服务器吗?
  • 没错,VS Code 的直播服务器仅用于静态托管

标签: javascript php html jquery database


【解决方案1】:

我认为问题出在你的 php 和 js...

如果你检查得当。在 PHP 中

$image = $_POST["image"]; 

索引未在 js 中定义的图像..

data: imgdata,

应该是

data: {'image' : imgdata}

尝试上述更改并报告。

更新

在您的 js api/insertDrawing.php 中,但您没有指定正确的 php 文件,哪个代码属于该文件。您是否在该文件中添加了标头内容类型。

<?php

    $image = $_POST["image"];
    
    $data = Array(
        "insertStatus" => "success",
        "image" => $image,
    );
    
    echo json_encode($data);

通过从 js 中删除内容类型,上述代码可以完美运行。

$.ajax({
        method: "POST",
        url: 'file.php',
        dataType: "json",
        data: {'image': imgdata},
      }).done(function(data) {
          console.log(data.image);
      });

结果是;

image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgA"
insertStatus: "success"

【讨论】:

  • 我更新了我的答案,但仍在等待 OP 回复。
  • 您好,我尝试按照您的建议进行更正,但仍然收到 POST 405(不允许使用方法)错误。另外,如何添加标题内容类型??
  • 尝试在不添加到数据库的情况下将 ajax 发送到服务器。如果发送成功.. 比我们必须找出错误
  • 我将服务器更改为xampp,错误405消失了,但我仍然无法将其保存到数据库
  • 更新:我现在可以保存画布链接了!非常感谢阿什!!你帮了大忙!
猜你喜欢
  • 1970-01-01
  • 2020-04-29
  • 2020-06-17
  • 2019-11-07
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 2021-06-04
  • 2011-11-05
相关资源
最近更新 更多