如何用 canvas.toDataURL 的结果替换文件输入的内容?
How to replace a file input's content by the result of canvas.toDataURL?
以下代码(受 HTML5 Pre-resize images before uploading 的主要答案启发)从 <input type="file">
中获取选定的图像文件,将其重新压缩为质量为 50% 的 JPG 并放入变量 dataurl
.
问:如何用这个新压缩的文件替换<input type="file">
的内容?那么在提交<form>
时,会提交this新文件吗?
注意:我不想使用AJAX上传,而是<form>
的标准POST。 "posted" 文件应该是 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" />
我们似乎无法修改 <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" />
<form>
中的输出 hidden
字段是 base64 编码的,即类似于:
data:image/jpeg;base64,/9j/4AAQSkZJRgAB...
以下代码(受 HTML5 Pre-resize images before uploading 的主要答案启发)从 <input type="file">
中获取选定的图像文件,将其重新压缩为质量为 50% 的 JPG 并放入变量 dataurl
.
问:如何用这个新压缩的文件替换<input type="file">
的内容?那么在提交<form>
时,会提交this新文件吗?
注意:我不想使用AJAX上传,而是<form>
的标准POST。 "posted" 文件应该是 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" />
我们似乎无法修改 <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" />
<form>
中的输出 hidden
字段是 base64 编码的,即类似于:
data:image/jpeg;base64,/9j/4AAQSkZJRgAB...