【问题标题】:Why won't my canvas upload to the server?为什么我的画布不能上传到服务器?
【发布时间】:2016-04-03 16:02:20
【问题描述】:

尝试制作一个画布,您可以在其中添加背景、贴纸和文本等内容,然后将其上传到画布所在的服务器。

遵循不同的指南和代码,除了上传到服务器部分外,一切正常。

var canvas = new fabric.Canvas('canvas');

document.getElementById('file').addEventListener("change", function(e) {
  var file = e.target.files[0];
  var reader = new FileReader();
  console.log("reader   " + reader);
  reader.onload = function(f) {
    var data = f.target.result;
    fabric.Image.fromURL(data, function(img) {
      var oImg = img.set({
        left: 70,
        top: 100,
        width: 250,
        height: 200,
        angle: 0
      }).scale(0.9);
      canvas.add(oImg).renderAll();
      canvas.setActiveObject(oImg);
    });
  };
  reader.readAsDataURL(file);
});

$('#fill').change(function() {
  var obj = canvas.getActiveObject();
  if (obj) {
    obj.setFill($(this).val());
  }
  canvas.renderAll();
});

$('#font').change(function() {
  var obj = canvas.getActiveObject();
  if (obj) {
    obj.setFontFamily($(this).val());
  }
  canvas.renderAll();
});

function addText() {
  var oText = new fabric.IText('Tap and Type', {
    left: 100,
    top: 100,
  });

  canvas.add(oText);
  canvas.setActiveObject(oText);
  $('#fill, #font').trigger('change');
  oText.bringToFront();
}

document.querySelector('#txt').onclick = function(e) {
  e.preventDefault();
  canvas.deactivateAll().renderAll();
  document.querySelector('#preview').src = canvas.toDataURL();
};



canvas.add(new fabric.IText('Tap and Type', {
  fontFamily: 'arial black',
  left: 100,
  top: 100,
}));


function Shirt_Load(img) {
  var shirt = img.src;
  canvas.setBackgroundImage(shirt, canvas.renderAll.bind(canvas), {
    width: 600,
    height: 600
  });

}
var photo = canvas.toDataURL('image/jpeg');
$.ajax({
  method: 'POST',
  url: 'photo_upload.php',
  data: {
    photo: photo
  }
});
canvas {
  border: 1px solid black;
}

HTML
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://rawgit.com/kangax/fabric.js/master/dist/fabric.min.js"></script>

<input type="file" id="file">
<input type="color" value="blue" id="fill" />
<select id="font">
  <option>arial</option>
  <option>tahoma</option>
  <option>times new roman</option>
</select>
<button onclick="addText()">Add Custom Text</button>
<br />
<canvas id="canvas" width="750" height="550"></canvas>
<a href='' id='txt' target="_blank">Preview</a>
<br />
<img id="preview" />

<button type="submit" formmethod="post" formaction="photo_upload.php">Submit</button>
</form>

<img onclick="Shirt_Load(this);" src="http://www.koffid.nl/pics/bg1.png" width="100" height="100" />
<img onclick="Shirt_Load(this);" src="http://www.koffid.nl/pics/mk.png" width="100" height="100" />

和php文件:

<?php
	
	$data = $_POST['photo'];
	list($type, $data) = explode(';', $data);
	list(, $data)      = explode(',', $data);
	$data = base64_decode($data);

	mkdir($_SERVER['DOCUMENT_ROOT'] ./photos);

	file_put_contents($_SERVER['DOCUMENT_ROOT'] ./photos/.time().'.png', $data);
	die;
?>

非常感谢任何帮助,谢谢!

【问题讨论】:

  • 我建议将图像作为原始 POST 数据发送,而不是 url 编码的 POST 参数
  • 感谢您的建议!但是这里需要一点手,应该改哪部分代码?
  • 您是否检查过控制台 (F12) 以查看是否有任何错误? (例如,像安全错误、类型错误...)

标签: javascript php html canvas upload


【解决方案1】:

一件事:

var photo = canvas.toDataURL('image/jpeg');
$.ajax({
  method: 'POST',
  url: 'photo_upload.php',
  data: {
    photo: photo
  }
});

应该是:

var photo = canvas.toDataURL('image/jpeg');
$.ajax({
  method: 'POST',
  url: 'photo_upload.php',
  data: {
    'photo': photo
  }
});

【讨论】:

  • 两者都是一样的。仅当属性名称不是有效的 JavaScript 标识符 (source) 时,才需要在属性名称周围加上引号
  • 添加引号并没有做任何可悲的事情。不过谢谢!
猜你喜欢
  • 2015-10-01
  • 2013-07-02
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 2022-01-14
  • 2013-09-20
  • 2018-10-13
  • 1970-01-01
相关资源
最近更新 更多