【问题标题】:Saving an uploaded image to localStorage (chrome extension)将上传的图像保存到 localStorage(chrome 扩展)
【发布时间】:2016-03-15 16:51:08
【问题描述】:

我无法找到用户在我的选项页面中输入的内容,我将如何在 localStorage 中存储上传的图像。没有太多关于如何做到这一点的文档,因为有一段时间它是known error,我在 Stack 上找不到任何示例。有一些示例说明如何保存页面上已有的图像,但输入的图像上没有任何内容。

我只有 HTML,但我想后面运行的 javascript 需要访问输入的值或其他东西(?)。

<input id="uploadImage" type="file" accept="image/*" />

那么用户选择一个文件后,输入的值为C:\fakepath\some_image.jpg。如果可能的话,我不想存储文件路径而是存储实际图像。

$("#uploadImage").change(function(){
    alert($("#uploadImage").val());
});

编辑:

我从this stack topic 找到了一个关于如何执行此操作的示例,但是我从$("#uploadImage").val() 获得的文件路径不起作用(所以即使文件路径有效,我也不知道此方法是否有效)

var img = new Image();
img.src = $("#uploadImage").val();
img.load = function() {
    var canvas = document.createElement('canvas');
    document.body.appendChild(canvas);
    var context = canvas.getContext('2d');
    context.drawImage(img, 0, 0);
    var data = context.getImageData(x, y, img.width, img.height).data;
    localStorage['uploadedImage'] = data; // save image data
};

【问题讨论】:

    标签: javascript jquery html


    【解决方案1】:

    这需要 FileReader API,并且只是此答案的修改版本(参考:Loading an image to a <img> from <input file>):

        var input = document.getElementById('uploadImage');
        input.onchange = function(evt){
            var tgt = evt.target || window.event.srcElement, 
                files = tgt.files;
    
            if (FileReader && files && files.length) {
                var fr = new FileReader();
                fr.onload = function () {
                    localStorage['foo'] = fr.result;
                }
                fr.readAsDataURL(files[0]);
            }
        }
    

    然后您可以通过执行以下操作将其应用为背景图像:

    var el = document.querySelector('body');
    el.style.backgroundImage = 'url(' + localStorage['foo'] + ')';
    

    【讨论】:

    • 所以在这之后我很困惑。您将图像数据作为字符串存储在 localStorage 中(正确吗?)。然后构建一个图像(出于我的目的,将其设置为背景)它看起来像-$('body').css({"background": localStorage['foo']});
    • @Jordan 更新了我的答案,没来得及测试,如果还有问题请告诉我。
    • 非常感谢!这不是我需要的全部,但你给了我一个可行的例子,我可以从那里开始
    【解决方案2】:

    好吧,你可以这样做:

    1. 首先使用 FileAPI 读取文件。一个很好的例子可以找到here
    2. 拥有文件内容后,您还有另一个问题:如何存储它。 LocalStorage 只接受字符串,因此您需要将二进制图像文件转换为 Base64,例如就像他们一样here
    3. 最后您可以稍后使用data-URI 渲染您的图像

    如您所见,这并不容易,但如果您按照说明进行操作,您仍然可以做到。

    【讨论】:

    • 我明白了,但是如何解决文件路径问题? (见我的编辑)
    • 你想从服务器获取图像数据吗?我的建议是在上传文件之前先读取文件,所以我想,在这种情况下不存在文件路径问题。如果你想从服务器下载图像,为什么不直接从服务器获取 Base64 格式的图像呢?那么为什么你实际上需要在 localStorage 中的图像呢?
    • 图片正在由用户上传,这是一个 chrome 扩展(如问题标题所述)
    【解决方案3】:

    您不能从http://https:// URL 打开file:// URL,因为这会破坏安全性(请参阅this question),但是,如果您只是从file:// URL 运行您的HTML 页面应该与您的代码一起使用。

    您确实需要确保画布元素与图像的尺寸相同,并且最好在onload 回调函数之后指定src 属性以防万一onload 回调绑定加载太快,无法到位。

    您还应该确保使用正确的 localStorage API 来存储和检索 localStorage 中的项目。

    canvas.toDataURL() 也是获取图像数据的 Base64 字符串的一种更简洁的方法。

    这是一些更新的代码。

    var img = new Image();
    img.onload = function() {
        var canvas = document.createElement('canvas');
        canvas.width = this.width;
        canvas.height = this.height;
        document.body.appendChild(canvas);
    
        var context = canvas.getContext('2d');
        context.drawImage(img, 0, 0);
    
        var data = canvas.toDataURL();
        localStorage.setItem('uploadedImage', data); // save image data
    };
    img.src = 'file://' + $("#uploadImage").val();
    

    然后要获取该项目并将其用作页面上的图像,您可以使用:

    var $img = $('<img />', { src: localStorage.getItem('uploadedImage') });
    $('body').append($img);
    

    【讨论】:

    • 我仍然对用户上传的图片的文件路径有问题,Failed to load resource: net::ERR_UNKNOWN_URL_SCHEME 我不认为我可以请求任何权限,因为这只是一个扩展程序而不是一个应用程序
    • 我不确定img.src = $("#uploadImage").val(); 是否会提供所需的结果。文件输入的值将无法以这种方式使用。在 Chrome 中,这会解析为 c:\fakepath\foo.png
    • 啊,是的,谢谢@MisterEpic,@Jordan 我想您需要img.src 位才能成为img.src = 'file://' + $('#uploadImage').val(); 答案已更新
    • @Mister,这是否意味着这真的不可能?而且@too,这并没有解决它。它是一个有效的 URL,但是当我运行它时它只会给我一个白色背景:$('body').css({"background": "url("+img.src+")"});
    • @Jordan 只要您的浏览器支持FileReader,这绝对是可能的。我的回答应该对你有用。
    猜你喜欢
    • 2017-03-15
    • 2012-11-10
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2015-03-10
    • 2015-10-29
    • 1970-01-01
    相关资源
    最近更新 更多