如何在客户端上调整图像大小,不起作用
How to resize images on client, not working
好的,我在这个问题上已经结束了。 我正在尝试使用 Javascript 在客户端上调整上传图像的大小。
我正在使用,
<script>
function uploadFiles() {
if (window.File && window.FileReader && window.FileList && window.Blob) {
if (!document.getElementById('confirm').checked) {
alert('You must click "confirm".');
return false;
}
alert('begin');
var files = document.getElementById('file').files;
for(var i = 0; i < files.length; i++) {
alert('start');
resizeAndUpload(files[i]);
}
return false;
} else {
alert('The File APIs are not fully supported in this browser.');
return false;
}
}
function resizeAndUpload(file) {
var reader = new FileReader();
reader.onloadend = function() {
var tempImg = new Image();
tempImg.src = reader.result;
tempImg.onload = function() {
var MAX_WIDTH = 300;
var MAX_HEIGHT = 300;
var tempW = tempImg.width;
var tempH = tempImg.height;
if (tempW > tempH) {
if (tempW > MAX_WIDTH) {
tempH *= MAX_WIDTH / tempW;
tempW = MAX_WIDTH;
}
} else {
if (tempH > MAX_HEIGHT) {
tempW *= MAX_HEIGHT / tempH;
tempH = MAX_HEIGHT;
}
}
var canvas = document.createElement('canvas');
canvas.width = tempW;
canvas.height = tempH;
var ctx = canvas.getContext("2d");
ctx.drawImage(this, 0, 0, tempW, tempH);
var fd = new FormData();
fd.append("upload-avatar", "Upload");
var confirm = 'off';
if (document.getElementById('confirm').checked) {
confirm = 'on';
}
fd.append("confirm", confirm);
fd.append("file", canvas.mozGetAsFile("image.jpg"));
fd.append("license", document.getElementById('license').value);
fd.append("name", document.getElementById('name').value);
var share = 'off';
if (document.getElementById('share').checked) {
share = 'on';
}
fd.append("share", share);
var xhr = new XMLHttpRequest();
xhr.open("POST", "MyUploadServlet");
xhr.send(fd);
alert('done');
}
}
reader.readAsDataURL(file);
}
</script>
然后在我的 html 中,
<form onsubmit="return uploadFiles()" method="post" enctype="multipart/form-data">
<input id="file" type="file" name="file" multiple/><br/>
<input id="confirm" type="checkbox" name="confirm">confirm</input><br/>
...
<input name="upload-resize" value="Upload and resize" type="submit"/><br/>
</form>
这实际上有效,但页面不会重新加载,我希望它这样做以显示上传的图像。 如果我从我认为会导致重新加载的函数中返回 true,那么它不起作用,它似乎永远不会调用帖子并挂起。我也尝试了location.reload(),但类似的问题。
好的,我想我对此代码有几个问题:
1 - 如何重新加载页面?
-> 答案似乎叫做"history.go(0);",这似乎有效,
2 - 这仅适用于 Firefox,不适用于 Chrome、IE 或 Safari我假设因为使用了"canvas.mozGetAsFile("image.jpg")",知道如何让它在 Chrome 上运行吗?
->使用 toBlob 似乎有效,但似乎在页面重新加载时中断,适用于 Firefox 但不适用于其他(没有我尚未尝试的 polyfill)
3 - 理想情况下,我会有两个按钮,一个用于调整大小,另一个用于提交普通表单,也不知道该怎么做。 目前,我有两个完整的表单副本,一个用于调整大小,一个用于普通文件提交。
4 - 图像以 png 格式上传,如何压缩为 jpeg 或一般压缩,即使调整大小,一些图像在失去压缩时显示的比大。
->使用 toBlob 似乎可以为您提供 jpg,但似乎会中断页面重新加载,适用于 Firefox 但不适用于其他(没有我尚未尝试的 polyfill)
很抱歉这个问题有多部分,但我认为任何想要这样做的人都需要所有的答案。
Q2使用 canvas.toBlob 而不是 canvas.mozGetAsFile。有一个填充物可以提高浏览器兼容性。
其页面中显示的使用情况
var canvas = document.createElement('canvas');
canvas.toBlob(
function (blob) {
// the blob is the jpeg file
var formData = new FormData();
formData.append('file', blob, fileName);
/* ... */
},
'image/jpeg'
);
第 4 季度指定质量从 0.0 到 1.0(最高质量)的canvas.toBlob(callback, 'image/jpeg', quality)
第三季度一个窗体中可以有多个按钮。
<form>
<input id="file" type="file" name="file" multiple/><br/>
<input id="confirm" type="checkbox" name="confirm">confirm</input><br/>
...
<input name="upload" value="Upload" type="button"/>
<input name="upload-resize" value="Upload and resize" type="button"/>
</form>
请注意,表单标签不包含 onsubmit 属性,输入类型现在是按钮而不是提交。
<input name="upload" value="Upload" type="button" onclick="myfunction()"/>
或者代替onclick属性,你可以使用addEventListener等。
第一季度你不会回到历史中去。您的 location.reload() 是正确的,但必须在发送/上传完成后完成。
xhr.onreadystatechange = function() {
if (xhr.readyState != 4) { return; }
location.reload();
}
XMLHttpRequest 是异步的,因此发送方法甚至在上传完成之前就返回了!要知道发送是否已完成,请使用 onreadystatechange,如上所示。
注意:您可能还需要检查响应状态代码。
- 使用css()设置背景图像;不起作用
- 图层删除(图像);在 Kinetic.js 中不起作用
- 为什么我的图像幻灯片不起作用
- 为什么这个jQuery图像映射在WordPress上不起作用
- 在页面中使用了两次多个图像上传,但第一个正在工作,另一个不起作用
- 用于图像上传的 ng 文件上传不起作用
- 当图像和链接是 json 对象属性的值时,它们不起作用
- JavaScript 图像加载器不起作用
- 本地存储功能中的图像不起作用
- 使用 nameProp 的 JQuery 图像滚动更新在 Firefox 和 Chrome 中不起作用
- 如果图像具有 guid 作为名称,则 jqZoom 不起作用
- jQuery图像淡入淡出不起作用
- 输入类型的图像在Internet Explorer中不起作用,但在Chrome和Firefox中起作用
- Transloadit-图像自动旋转不起作用
- 滚动过标题后显示图像-尝试不起作用
- 上传前查看图像在IE中不起作用
- 简单的 Java 脚本背景图像不起作用
- 图像预览在Safari中不起作用
- ajax加载图像第二次在弹出jquery上不起作用
- Jquery setTimeout 不起作用(图像幻灯片)