开发者问题收集

如果我从外部 URL Fabric js 添加图像,则无法将画布导出到图像

2016-05-26
1311

您好,我创建了一个从外部 URL 添加图像的函数:

HTML:

<input type="text" id="IMGbyURL" placeholder="http://"/><a href="#" onclick="ImgPorURL(document.getElementById('IMGbyURL').value)">Agregar</a>

用于添加图像的 Javascript:

function ImgPorURL(srcImg){     
fabric.Image.fromURL(srcImg, function(oImg) {
canvas.add(oImg);
})
}

用于导出的 HTML:

<a href="#" onclick="convertToImagen()">Export</a>

用于导出画布的 Javascript:

function convertToImagen() {
canvas.deactivateAll().renderAll();  
window.open(canvas.toDataURL('jpg')); 
}

但是不起作用,有趣的是,如果我上传图像,保存到服务器中的任何文件夹并将图像添加到画布,它可以完美运行并且画布被导出为图像,但如果我从外部站点添加图像则不起作用...谢谢!!

2个回答

有趣的是,正如你所说,它被称为 CORS 。跨源资源共享。

Fabricjs 支持一些 CORS 功能

fabric.Image.fromURL(srcImg, function(oImg) {
canvas.add(oImg);
}, {crossOrigin: 'Anonymous'});

如果这不起作用,那么外部链接的服务器不支持在任何地方共享图像。除了在另一台服务器上共享之外,你几乎无能为力,包括你的。

AndreaBogazzi
2016-05-26

除了 @AndreaBogazzi 的回答 - 如果 FabricJS 配置 {crossOrigin: 'Anonymous'> 不起作用,您可以使用 PHP 代理脚本(在后端),该脚本会将图像从第三方下载到您的域并使用它们提供结构。以下是 示例脚本

<?php
// define absolute path to image folder
$image_folder = '/home/mydomain/upload_folder/';
// get the image name from the query string
// and make sure it's not trying to probe your file system
if (isset($_GET['pic']) && basename($_GET['pic']) == $_GET['pic']) {
    $pic = $image_folder.$_GET['pic'];
    if (file_exists($pic) && is_readable($pic)) {
        // get the filename extension
        $ext = substr($pic, -3);
        // set the MIME type
        switch ($ext) {
            case 'jpg':
                $mime = 'image/jpeg';
                break;
            case 'gif':
                $mime = 'image/gif';
                break;
            case 'png':
                $mime = 'image/png';
                break;
            default:
                $mime = false;
        }
        // if a valid MIME type exists, display the image
        // by sending appropriate headers and streaming the file
        if ($mime) {
            header('Content-type: '.$mime);
            header('Content-length: '.filesize($pic));
            $file = @ fopen($pic, 'rb');
            if ($file) {
                fpassthru($file);
                exit;
            }
        }
    }
}
?>
shershen
2016-05-27