【问题标题】:Javascript webcam capture and upload to server with PHPJavascript 网络摄像头使用 PHP 捕获并上传到服务器
【发布时间】:2014-02-04 20:05:30
【问题描述】:

我有一个页面,其中包含使用 javascript 和 PHP 上传文件的成功图像上传表单画布。第二个页面有一个成功的网络摄像头捕获到画布并正确显示。我正在尝试使用 cam 来调整图像上传脚本,捕获实时 css 对象什么都不做...... html是: 折断

    <div id="upContent">
    <div class="upload-wrapper">
      <span id="upCanvas">Upload This Canvas</span>
    </div>
    <div class="return-data"></div>
</div>  

    <script src="js/interactioncam.js"></script> 
    <script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
    <!--script src="js/holder.js"></script-->

而java脚本是:

//interactioncam.js - grab a pic
(function() {

  var data;
  var dataURL;

  var streaming = false,
      video        = document.querySelector('#video'),
      cover        = document.querySelector('#cover'),
      canvas       = document.querySelector('#canvas'),
      photo        = document.querySelector('#photo'),
      startbutton  = document.querySelector('#startbutton'),
      width = 320,
      height = 240;

  navigator.getMedia = ( navigator.getUserMedia || 
                         navigator.webkitGetUserMedia ||
                         navigator.mozGetUserMedia ||
                         navigator.msGetUserMedia);

  navigator.getMedia(
    { 
      video: true, 
      audio: false 
    },
    function(stream) {
      if (navigator.mozGetUserMedia) { 
        video.mozSrcObject = stream;
      } else {
        var vendorURL = window.URL || window.webkitURL;
        video.src = vendorURL ? vendorURL.createObjectURL(stream) : stream;
      }
      video.play();
    },
    function(err) {
      console.log("An error occured! " + err);
    }
  );

  video.addEventListener('canplay', function(ev){
    if (!streaming) {
      height = video.videoHeight / (video.videoWidth/width);
      video.setAttribute('width', width);
      video.setAttribute('height', height);
      canvas.setAttribute('width', width);
      canvas.setAttribute('height', height);
      streaming = true;
    }
  }, false);

  function takepicture() {
    canvas.width = width;
    canvas.height = height;
    canvas.getContext('2d').drawImage(video, 0, 0, width, height);
    var data = canvas.toDataURL('image/png');
    var dataURL = canvas.toDataURL();
    photo.setAttribute('src', data);
  };

  startbutton.addEventListener('click', function(ev){
      takepicture();
    ev.preventDefault();
  }, false);

  // Convert DataURL to Blob object
  function dataURLtoBlob(dataURL) {
    // Decode the dataURL
    var dataURL = canvas.toDataURL();    
    var binary = atob(dataURL.split(',')[1]);
    // Create 8-bit unsigned array
    var array = [];
    for(var i = 0; i < binary.length; i++) {
        array.push(binary.charCodeAt(i));
    }
    // Return our Blob object
    return new Blob([new Uint8Array(array)], {type: 'image/png'});
  }

  // Send IT
  $("#upCanvas").live("click", function(){
    $("#upCanvas").html("<img src='img/load.gif' alt='load'>&nbsp;&nbsp;&nbsp;Uploading ..");
    // Convert Canvas DataURL
    var dataURL= canvas.toDataURL();

    // Get Our File
    var file= dataURLtoBlob(dataURL);

    // Create new form data
    var fd = new FormData();

    // Append our image
    fd.append("imageNameHere", file);

    $.ajax({
       url: "uploadFile.php",
       type: "POST",
       data: fd,
       processData: false,
       contentType: false,
    }).done(function(respond){
      $("#upCanvas").html("Upload This Canvas");
        $(".return-data").html("Uploaded Canvas image link: <a href="+respond+">"+respond+"</a>").hide().fadeIn("fast");
    });
  });

})();

php上传是:

<?php
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br>";
    echo "Type: " . $_FILES["file"]["type"] . "<br>";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
  {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upimg/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>

关于为什么我无法将画布转换为文件和上传脚本工作的任何建议?

【问题讨论】:

    标签: javascript php jquery html canvas


    【解决方案1】:

    您需要将捕获的图像发布php,为此您可以使用jquery .ajax(),这是一个完整的示例:

    上传.php

    <?php
    $img = !empty($_REQUEST['imgBase64']) ? $_REQUEST['imgBase64'] : die("No image was posted");
    $imgName = $_REQUEST['imgName'];
    $img = str_replace('data:image/png;base64,', '', $img);
    $img = str_replace(' ', '+', $img);
    $fileData = base64_decode($img);
    //saving
    file_put_contents($imgName, $fileData);
    

    现在是js/jquerycsshtml

    (function() {
        // The width and height of the captured photo. We will set the
        // width to the value defined here, but the height will be
        // calculated based on the aspect ratio of the input stream.
    
        var width = 320; // We will scale the photo width to this
        var height = 0; // This will be computed based on the input stream
    
        // |streaming| indicates whether or not we're currently streaming
        // video from the camera. Obviously, we start at false.
    
        var streaming = false;
    
        // The various HTML elements we need to configure or control. These
        // will be set by the startup() function.
    
        var video = null;
        var canvas = null;
        var photo = null;
        var startbutton = null;
    
        function startup() {
            video = document.getElementById('video');
            canvas = document.getElementById('canvas');
            photo = document.getElementById('photo');
            startbutton = document.getElementById('startbutton');
    
            navigator.getMedia = (navigator.getUserMedia ||
                navigator.webkitGetUserMedia ||
                navigator.mozGetUserMedia ||
                navigator.msGetUserMedia);
    
            navigator.getMedia({
                    video: true,
                    audio: false
                },
                function(stream) {
                    if (navigator.mozGetUserMedia) {
                        video.mozSrcObject = stream;
                    } else {
                        var vendorURL = window.URL || window.webkitURL;
                        video.src = vendorURL.createObjectURL(stream);
                    }
                    video.play();
                },
                function(err) {
                    console.log("An error occured! " + err);
                }
            );
    
            video.addEventListener('canplay', function(ev) {
                if (!streaming) {
                    height = video.videoHeight / (video.videoWidth / width);
    
                    // Firefox currently has a bug where the height can't be read from
                    // the video, so we will make assumptions if this happens.
    
                    if (isNaN(height)) {
                        height = width / (4 / 3);
                    }
    
                    video.setAttribute('width', width);
                    video.setAttribute('height', height);
                    canvas.setAttribute('width', width);
                    canvas.setAttribute('height', height);
                    streaming = true;
                }
            }, false);
    
            startbutton.addEventListener('click', function(ev) {
                takepicture();
                ev.preventDefault();
            }, false);
    
            clearphoto();
        }
    
        // Fill the photo with an indication that none has been
        // captured.
    
        function clearphoto() {
            var context = canvas.getContext('2d');
            context.fillStyle = "#AAA";
            context.fillRect(0, 0, canvas.width, canvas.height);
    
            var data = canvas.toDataURL('image/png');
            photo.setAttribute('src', data);
        }
    
        // Capture a photo by fetching the current contents of the video
        // and drawing it into a canvas, then converting that to a PNG
        // format data URL. By drawing it on an offscreen canvas and then
        // drawing that to the screen, we can change its size and/or apply
        // other changes before drawing it.
    
        function takepicture() {
            var context = canvas.getContext('2d');
            if (width && height) {
                canvas.width = width;
                canvas.height = height;
                context.drawImage(video, 0, 0, width, height);
    
                var data = canvas.toDataURL('image/png');
                photo.setAttribute('src', data);
    
                $.ajax({
                    type: "POST",
                    url: "upload.php",
                    data: {
                        imgBase64: data,
                        imgName: "webcam.png"
                    }
                }).done(function(o) {
                    console.log('saved');
                });
            } else {
                clearphoto();
            }
        }
    
        // Set up our event listener to run the startup process
        // once loading is complete.
        window.addEventListener('load', startup, false);
    })();
    #video {
      border: 1px solid black;
      box-shadow: 2px 2px 3px black;
      width:320px;
      height:240px;
    }
    
    #photo {
      border: 1px solid black;
      box-shadow: 2px 2px 3px black;
      width:320px;
      height:240px;
    }
    
    #canvas {
      display:none;
    }
    
    .camera {
      width: 340px;
      display:inline-block;
    }
    
    .output {
      width: 340px;
      display:inline-block;
    }
    
    #startbutton {
      display:block;
      position:relative;
      margin-left:auto;
      margin-right:auto;
      bottom:32px;
      background-color: rgba(0, 150, 0, 0.5);
      border: 1px solid rgba(255, 255, 255, 0.7);
      box-shadow: 0px 0px 1px 2px rgba(0, 0, 0, 0.2);
      font-size: 14px;
      font-family: "Lucida Grande", "Arial", sans-serif;
      color: rgba(255, 255, 255, 1.0);
    }
    
    .contentarea {
      font-size: 16px;
      font-family: "Lucida Grande", "Arial", sans-serif;
      width: 760px;
    }
    <html>
    <head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
    	<meta charset='utf-8'>
    </head>
    <body>
    <div class="contentarea">
      <div class="camera">
        <video id="video">Video stream not available.</video>
        <button id="startbutton">Take photo</button> 
      </div>
      <canvas id="canvas">
      </canvas>
      <div class="output">
        <img id="photo" alt="The screen capture will appear in this box."> 
      </div>
    </div>
    </body>
    </html>

    基于:
    https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Taking_still_photos
    https://stackoverflow.com/a/13198699/797495
    https://stackoverflow.com/a/31128229/797495


    注意:
    我已经在我的服务器上测试了代码,它按预期工作。

    【讨论】:

      【解决方案2】:

      您可以添加:

      .canvas{display:block;}
      

      【讨论】:

        【解决方案3】:

        文件上传名称是imageNameHere 而不是file。 要访问数据,您应该将 imageNameHere 替换为 file 或更改 php 代码。 否则上传的dataUrl可能不在base64?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-09-14
          • 1970-01-01
          • 2015-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多