【问题标题】:BLOB URL to file with PHP用 PHP 归档的 BLOB URL
【发布时间】:2012-11-08 12:56:02
【问题描述】:

我正在尝试创建一个文件预览系统。

当用户点击上传按钮并选择文件时,我使用 HTML5 FILE API 获取所有文件信息并为文件创建缩略图。

用户可以取消部分文件的上传,也可以添加更多文件。

我现在拥有的是这样的:

<p><input id="blob" name="blob" type="file" size="75" multiple /></p>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input id="blobtype" name="blobtype" type="text" size="20" />
<input id="bloburl" name="bloburl" type="text" size="50" />
<input id="salvar" name="salvar" type="submit" value="salvar" />
</form>
<p id="result"></p>

还有我的javascript:

function cbu(file)
{
if (window.URL){ return window.URL.createObjectURL(file);}
else if (window.webkitURL){ return window.webkitURL.createObjectURL(file);}
else if (window.createObjectURL){ return window.createObjectURL(file);}
else if (window.createBlobURL){ return window.createBlobURL(file); }
}

document.getElementById("blob").onchange = function(event)
{
var result = document.getElementById("result");
var i = 0, j = event.target.files.length;
for (i = 0; i < j; i++)
{
    var url = cbu(event.target.files[i]);
    var img = document.createElement("img");
    img.onload = function(){ }
    result.appendChild(img);
    img.src = url;
    document.getElementById("blobtype").value = event.target.files[i].type;
    document.getElementById("bloburl").value = url;
    }
};

它会生成这样的缩略图:

<img src="blob:b9a8e310-05b3-48ba-ba24-9ca7cf287f71">

当用户提交表单时,这个值blob:b9a8e310-05b3-48ba-ba24-9ca7cf287f71被发送到一个PHP文件。

所以我的问题是,我怎样才能将此 blob url 转换为文件,以便将其保存在我的应用程序中?

有更好的方法吗?

感谢您的帮助!

【问题讨论】:

    标签: php javascript blob fileapi


    【解决方案1】:

    嗯,我一直在寻找解决方案,我找到了这个:Canvas。

    Canvas 元素具有 toDataUrl() 方法,该方法返回其包含的图像的数据 URL。

    所以我一直在做同样的事情,但是当我提交表单时,我使用以下函数:

    function putImage(){
        var url = document.getElementById("img1").src; // 'img1' is the thumbnail - I had to put an id on it
        var canvas = document.getElementById("MyCanvas");
        if (canvas.getContext) {
            var ctx = canvas.getContext("2d");
    
            var img = new Image();
            img.src = url;
            img.onload = function () {
                // Desenha a imagem no canvas...
                ctx.drawImage(img,0,0);
    
                // Grava o Data URL na imagem...
                var myImage = canvas.toDataURL("image/png");
                document.getElementById("dataurl").value = myImage;
            }
        }
    };
    

    我在页面上为画布再创建一个元素:

    <canvas id="MyCanvas">This browser or document mode doesn't support canvas</canvas>
    

    表单上还有一个元素用于保存数据 URL:

    <input id="dataurl" name="dataurl" type="text" size="50" />
    

    好吧,现在我可以在 PHP 中获取所有内容并执行以下操作:

    if($_POST)
    {
        //echo '<pre>'; print_r($_POST); echo '</pre>';
    
        $blob = $_POST['bloburl'];
        $type = $_POST['blobtype'];
        $data = $_POST['dataurl'];
    
        $contents_split = explode(',', $data);
        $encoded = $contents_split[count($contents_split)-1];
        $decoded = "";
        for ($i=0; $i < ceil(strlen($encoded)/256); $i++) {
            $decoded = $decoded . base64_decode(substr($encoded,$i*256,256)); 
        }
    
        $fp = fopen('imagembaixada.jpg', 'w');
            fwrite($fp, $decoded);
            fclose($fp);
        }
    }
    

    现在我的图像已保存。

    它可以工作,但看起来效率很低。

    如果有人知道在上传之前为图像创建预览的更好方法,请告诉我!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 2020-09-29
      • 2021-03-02
      相关资源
      最近更新 更多