无法将画布数据从 Javascript AJAX 发送到 PHP 页面

2023-12-07

我有一个视频元素在我的页面上显示网络摄像头流。 接下来我有一个canvas具有需要的功能快照并在画布上显示图像。 现在我需要将此画布图像发送到服务器并使用 PHP 将其保存到文件中。 我结合了网上的各种教程,最终得到了下面的代码,但是 保存在服务器文件夹中的图像只是空白,所以我猜 PHP 文件没有 正确接收要显示的数据...如果可以的话请帮忙:) 只有 Jquery + AJAX 不传输 post 变量才是问题... 这是代码:

var int=self.setInterval(function(){snapshot()},2000);

    function snapshot() {
      // Draws current image from the video element into the canvas
        ctx.drawImage(output, 0,0, canvas.width, canvas.height);
        var dataURL = canvas.toDataURL();
        dataURL = dataURL.replace('data:image/png;base64,','');

        $.ajax({
        type: 'POST',
        url: 'onlinewebcams.php',
        data: postData,
        contentType: 'application/json'
        });

    }

然后有一个单独的 PHP 文件,但包含在保存 POSTed 图像的同一页面上(不起作用):

这是 PHP 文件代码:

sleep(5); // wait 5 seconds
define('UPLOAD_DIR', 'allwebcams/');
$img = $_POST['dataURL'];
$img = str_replace('data:image/png;base64,', '', $img);
$img = str_replace(' ', '+', $img);
$data = base64_decode($img);
$file = UPLOAD_DIR .uniqid() . '.png';
$success = file_put_contents($file, $data);
print $success ? $file : 'Unable to save the file.';

有几件事:

客户端:

在您的 ajax POST 中,您尚未定义 postData,因此 ajax 发送的是空白字符串。

您应该发送 dataURL。那么你的数据包就是一个未命名的字符串。

我更喜欢将数据包装到一个对象中。这样,如果我以后想要发送更多信息而不仅仅是编码图像,我只需向对象添加另一个属性即可。例如,您可能想要发送生成图像的网络摄像头的 ID,以及生成图像的时间。

顺便说一句,发送的内容类型不是 json,而是 base64 编码的图像数据。您可以省略内容类型,因为您的 PHP 知道将处理什么数据类型。

另外,您可能希望从 PHP 获得指示成功/失败的响应,或者可能是刚刚保存的文件的名称。您可以使用 ajax POST 中的 .done 响应回调处理程序来完成此操作。

试试这个 AJAX 帖子:

// create a dataUrl from the canvas
var dataURL= canvas.toDataURL();

// post the dataUrl to php
$.ajax({
  type: "POST",
  url: "onlinewebcams.php",
  data: {image: dataURL}
}).done(function( respond ) {
  // you will get back the temp file name
  // or "Unable to save this image."
  console.log(respond);
});

您可以去掉数据类型标头(data:image/png;base64) 在 ajax 之前或在 PHP 内。

在您的代码中,您在客户端代码和 PHP 代码中都将其剥离——没有必要;)

The PHP

我不太确定你为什么在 php 代码中睡觉——无论如何......

在 PHP 中,在尝试处理数据之前,您应该始终检查数据是否存在且不为空。如果某些 php 服务器收到空数据包,它们会特别不安。

您的 $img=$_POST['dataURL'] 正在请求一条不存在的命名数据。这就是 php 创建空文件的原因。

试试这个 PHP 代码:

// make sure the image-data exists and is not empty
// xampp is particularly sensitive to empty image-data 
if ( isset($_POST["image"]) && !empty($_POST["image"]) ) {    

    // get the dataURL
    $dataURL = $_POST["image"];  

    // the dataURL has a prefix (mimetype+datatype) 
    // that we don't want, so strip that prefix off
    $parts = explode(',', $dataURL);  
    $data = $parts[1];  

    // Decode base64 data, resulting in an image
    $data = base64_decode($data);  

    // create a temporary unique file name
    $file = UPLOAD_DIR . uniqid() . '.png';

    // write the file to the upload directory
    $success = file_put_contents($file, $data);

    // return the temp file name (success)
    // or return an error message just to frustrate the user (kidding!)
    print $success ? $file : 'Unable to save this image.';

}

以及常见的问题:

  • 确保您已正确设置上传目录。
  • 确保您对上传目录设置了正确的权限。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法将画布数据从 Javascript AJAX 发送到 PHP 页面 的相关文章

随机推荐

  • Safari 5 扩展:如何检测窗口的当前选项卡何时发生更改?

    我有一个包含工具栏的 Safari 5 扩展 每当当前选项卡发生更改时 该工具栏都应该更新 我想从我的酒吧脚本中做这样的事情 safari self browserWindow addEventListener activeTab tabC
  • x86 NASM 程序集 - 输入问题

    我正在努力从用户那里获取两次输入 并比较输入 如果它们相同 则程序退出 如果没有 它会重新打印第一次输入的内容 并等待用户输入内容 如果相同 则发生与之前相同的情况 如果没有 就会发生与之前相同的情况 输入和循环不是问题 主要问题是我从程序
  • R 中的大幂

    我正在尝试计算 2 1000 并对数字的值求和 出于所有意图和目的 它seems就像我有正确的方法但错误的答案 我不确定是否有特殊的方法来进行求和 或者我的选择可能是混乱的 无论如何 R 中的 2 1000 给出 1 072e 301 我用
  • 如何在matlab中创建留一交叉验证? [复制]

    这个问题在这里已经有答案了 我仍然对我的代码感到困惑 我尝试在 matlab 中实现留一交叉验证进行分类 所以在这里 我从训练中取出一个数据作为测试数据 我已经在matlab中编写了代码 但我不确定它是否正确 因为结果是错误的 有人可以帮我
  • 无论如何,是否可以在数据流管道中共享状态变量?

    我正在用 python 制作数据流管道 我想跨管道转换和跨工作节点共享全局变量 例如全局变量 跨多个工作人员 有什么办法可以支持这个吗 提前感谢 有状态处理可用于在特定节点的工作人员之间共享状态 但无法在转换之间共享 https beam
  • Azure 角色本地存储是否保证下一个使用同一主机的应用程序无法访问?

    假设我的 Azure 角色将文件存储到角色本地文件系统并忘记删除它们 将来使用该主机的另一个应用程序是否可以访问这些文件 我读了白皮书它充满了营销风格的陈述 但我找不到关于在新角色开始之前主机 清理 得有多彻底的明确陈述 我能否完全确定另一
  • 在 Swift 3 Playground 中读取 plist

    我在这里关注了很多问题 但似乎没有任何效果 我在用Swift3 in a Playground 在 El Capitan 和 Xcode 8 1 上运行 我有一个plist以根作为Dictionary包含一个 Int 值和两个 2D Int
  • wxPython 网格中的自动换行和换行符

    我想用具有以下行为的单元格实现一个网格 如果单元格文本不适合单元格 则应将其换行 单元格文本中的换行符 n 也应该被处理 即 当您为单元格启用 换行 选项时 与 MS Excel OO Calc 等表格编辑器中的行为相同 我尝试按如下方式执
  • 如何修剪传递 select 查询的 in 子句的值

    下面是使用 in 条件选择记录的简单 SQL 查询 like this I have 6000 usernames select from tblUsers where Username in abc xyz pqr mnop 我知道有LT
  • 膨胀类 android.support.design.widget.TabLayout 时出错

    我正在尝试使用 Eclipse 创建一个基于 Google 的 材料设计 的菜单选项卡 但出现错误 01 07 01 02 10 238 E tag 6696 contact on create called 01 07 01 02 10
  • Microsoft Solver Foundation 对一个简单的 ILP 给出了错误的答案

    我想使用 Microsoft Solver Foundation 解决 C 中的二元线性问题 我不知道为什么我得到了错误的答案 目标值应该是 41 1 但我得到 213 5 个变量的值应该是 1 其他变量应该是 0 但是我得到了很多错误值的
  • 在 symfony 中获取服务内的路由名称

    伙计们 我有一个服务 其中有一个接受路由器服务的构造函数 我的问题是如何知道当前的路线名称 这是我的服务 class Navigation protected modules protected router public function
  • 为长度为 1 的位域赋值

    假设我有 struct A signed char a 1 unsigned char b 1 如果我有 A two three two a 2 two b 2 three a 3 three b 3 two将包含0s 在它的领域 而thr
  • 如何使用@PathVariable配置spring-data-rest搜索方法路径

    我想通过将参数作为路径变量传递来自定义 spring data rest 搜索方法路径 如下所示 http localhost 8080 orders search customers customerId findByCustomer P
  • JavaScript 打包整数并计算任意精度浮点数:

    我需要在 JavaScript 中执行以下操作 但到目前为止无法找到无缝执行此操作的解决方案 按特定顺序获取两个整数并将它们像 Python 的 struct 模块一样打包 这个打包值 支持与主机不同的字节序的好处 将被转换为 64 位浮点
  • 如何从准备好的语句中获取关联数组中的所有内容?

    我正在尝试这段代码 if result this gt mysqli gt prepare SELECT FROM mytable WHERE rows1 result gt bind param i id result gt execut
  • Neo4j如何从某个起始节点递归删除节点

    在我的 Neo4j 数据库中 我有以下实体 NodeEntity public class Product private final static String CONTAINS CONTAINS private final static
  • r - 如何从分组数据中的最后一个日期条目中减去第一个日期条目并控制输出格式

    这个问题与另一个线程中提出的问题非常相似 可以找到here 我正在尝试实现类似的目标 在组 事件 内从最后一个日期减去第一个日期 我正在使用该线程的答案中提供的 dplyr 包和代码 从最后日期中减去第一个日期是可行的 但它并不能提供令人满
  • Getx 4.6.1 的问题

    添加 get 4 6 1 后出现以下错误 Code class MyApp extends StatelessWidget This widget is the root of your application override Widge
  • 无法将画布数据从 Javascript AJAX 发送到 PHP 页面

    我有一个视频元素在我的页面上显示网络摄像头流 接下来我有一个canvas具有需要的功能快照并在画布上显示图像 现在我需要将此画布图像发送到服务器并使用 PHP 将其保存到文件中 我结合了网上的各种教程 最终得到了下面的代码 但是 保存在服务