如何用canvas.toDataURL的结果替换文件输入的内容?

问题描述 投票:0回答:1

以下代码(灵感来自HTML5 Pre-resize images before uploading的主要答案)从<input type="file">获取所选图像文件,将其重新压缩为质量为50%的JPG到变量dataurl中。

问题:如何用这个新压缩的文件替换<input type="file">的内容?那么在提交<form>时,这个新文件会被提交吗?

注意:我不想使用AJAX进行上传,而是使用<form>的标准POST。 “已发布”文件应为dataurl,即它应该好像用户在<input type="file">中选择的文件是dataurl生成的文件。

function doit() {
    var input = document.getElementById('file'),
        canvas = document.getElementById('canvas');
    var file = input.files[0];
    var img = document.createElement("img");
    var reader = new FileReader();  
    reader.onload = function(e) { img.src = e.target.result }
    reader.readAsDataURL(file);
    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0);
    var dataurl = canvas.toDataURL("image/jpeg", 0.5);
    console.log(dataurl);
}    
<form action="/upload" method="post">
<input type="file" onchange="doit();" id="file" /><br><br>
<input type="submit" />
</form>
<canvas id="canvas" style="display: none" />  
javascript html forms html5-canvas form-submit
1个回答
0
投票

我们似乎无法修改<input type="file">,但我们可以将数据添加到另一个文本字段(由@PatrickEvans建议)或<input type="hidden">

function doit() {
    var file = document.getElementById('file').files[0],
        canvas = document.getElementById('canvas'),
        hidden = document.getElementById('hidden'),
        ctx = canvas.getContext("2d"),
        img = document.createElement("img"),
        reader = new FileReader();  
    
    reader.onload = function(e) { 
        img.src = e.target.result;
    }
    
    img.onload = function () { 
        ctx.drawImage(img, 0, 0);
        hidden.value = canvas.toDataURL("image/jpeg", 0.5);
    }
    reader.readAsDataURL(file);
}
<input type="file" onchange="doit();" id="file" />

<form action="/upload" method="post">
<input type="hidden" id="hidden" />
<input type="submit" />
</form>

<canvas id="canvas" style="display: none" />

hidden中的输出<form>字段是base64编码的,例如:

data:image/jpeg;base64,/9j/4AAQSkZJRgAB...
© www.soinside.com 2019 - 2024. All rights reserved.