Asp.net 在文件上载期间使用Javascript获取图像尺寸
我有文件上传UI元素,用户将在其中上传图像。在这里,我必须在客户端验证图像的高度和宽度。在JS中是否可以找到只有文件路径的图像的大小Asp.net 在文件上载期间使用Javascript获取图像尺寸,asp.net,javascript,image,validation,file-upload,Asp.net,Javascript,Image,Validation,File Upload,我有文件上传UI元素,用户将在其中上传图像。在这里,我必须在客户端验证图像的高度和宽度。在JS中是否可以找到只有文件路径的图像的大小 注意:如果没有,是否有其他方法在客户端查找维度?不,您不能,文件名和文件内容在http headerbody中发送到服务器,javascript无法操作这些字段。您可以在支持W3C新版本的浏览器上执行此操作,使用FileReader界面上的功能,并将数据URL分配给img的src(之后可以读取图像的高度和宽度)。目前Firefox3.6支持文件API,我认为Chr
注意:如果没有,是否有其他方法在客户端查找维度?不,您不能,文件名和文件内容在http headerbody中发送到服务器,javascript无法操作这些字段。您可以在支持W3C新版本的浏览器上执行此操作,使用
FileReader
界面上的功能,并将数据URL分配给img
的src
(之后可以读取图像的高度和宽度)。目前Firefox3.6支持文件API,我认为Chrome和Safari已经或即将支持
所以你在过渡阶段的逻辑是这样的:
检测浏览器是否支持文件API(这很简单:if(typeof window.FileReader=='function')
)
如果有,很好,在本地读取数据并将其插入图像中以查找尺寸
如果没有,则将文件上载到服务器(可能从iframe提交表单以避免离开页面),然后轮询服务器,询问图像有多大(或者如果愿意,只询问上载的图像)
编辑一段时间以来,我一直想制作一个文件API示例;这里有一个:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Show Image Dimensions Locally</title>
<style type='text/css'>
body {
font-family: sans-serif;
}
</style>
<script type='text/javascript'>
function loadImage() {
var input, file, fr, img;
if (typeof window.FileReader !== 'function') {
write("The file API isn't supported on this browser yet.");
return;
}
input = document.getElementById('imgfile');
if (!input) {
write("Um, couldn't find the imgfile element.");
}
else if (!input.files) {
write("This browser doesn't seem to support the `files` property of file inputs.");
}
else if (!input.files[0]) {
write("Please select a file before clicking 'Load'");
}
else {
file = input.files[0];
fr = new FileReader();
fr.onload = createImage;
fr.readAsDataURL(file);
}
function createImage() {
img = document.createElement('img');
img.onload = imageLoaded;
img.style.display = 'none'; // If you don't want it showing
img.src = fr.result;
document.body.appendChild(img);
}
function imageLoaded() {
write(img.width + "x" + img.height);
// This next bit removes the image, which is obviously optional -- perhaps you want
// to do something with it!
img.parentNode.removeChild(img);
img = undefined;
}
function write(msg) {
var p = document.createElement('p');
p.innerHTML = msg;
document.body.appendChild(p);
}
}
</script>
</head>
<body>
<form action='#' onsubmit="return false;">
<input type='file' id='imgfile'>
<input type='button' id='btnLoad' value='Load' onclick='loadImage();'>
</form>
</body>
</html>
局部显示图像尺寸
身体{
字体系列:无衬线;
}
函数loadImage(){
var输入、文件、fr、img;
if(typeof window.FileReader!=“函数”){
写入(“此浏览器尚不支持文件API。”);
返回;
}
输入=document.getElementById('imgfile');
如果(!输入){
写(“嗯,找不到imgfile元素。”);
}
如果(!input.files){
写入(“此浏览器似乎不支持文件输入的`files`属性。”);
}
如果(!input.files[0]),则为else{
写入(“请在单击“加载”之前选择一个文件”);
}
否则{
file=input.files[0];
fr=新文件读取器();
fr.onload=createImage;
fr.readAsDataURL(文件);
}
函数createImage(){
img=document.createElement('img');
img.onload=图像加载;
img.style.display='none';//如果不想显示它
img.src=fr.result;
文件.正文.附件(img);
}
函数imageLoaded(){
写入(img.宽度+“x”+img.高度);
//下一位删除图像,这显然是可选的——可能是您想要的
//用它做点什么!
img.parentNode.removeChild(img);
img=未定义;
}
函数写入(msg){
var p=document.createElement('p');
p、 innerHTML=msg;
文件.正文.附件(p);
}
}
在Firefox 3.6上非常有效。我避免使用那里的任何库,因此对于属性(DOM0)样式的事件处理程序等,我深表歉意。如果您使用基于flash的上载,例如SWFUpload,您可以获得所需的所有信息以及多个排队上载
我推荐SWFUpload,除了作为用户之外,我与它们没有任何关联
您也可以编写silverlight控件来选择并上传文件。HTML5绝对是正确的解决方案。
你应该永远为未来而不是过去编码。
处理HTML4浏览器的最佳方法是使用降级功能或使用Flash(但仅当浏览器不支持HTML5文件API时)
使用img.onload事件可以恢复文件的维度。
它适用于我正在开发的一个应用程序。前面的示例还可以,但还远远不够完美
var reader = new FileReader();
reader.onload = function(e)
{
var image = new Image();
image.onload = function()
{
console.log(this.width, this.height);
};
image.src = e.target.result;
};
reader.readAsDataURL(this.files[0]);
是否有其他方法可以在客户端找到维度?您需要将其上传到其他地方,在服务器中进行检查,并使用ajaxI将这些值取回。我不确定flash是否可以做到这一点,但java applet应该能够做到。或者看起来html5可以做到这一点,参见T.J.Crowder的回答Welcome!,看起来flash也能做到。你可以看看答案。flash应该在客户端完成当然,这需要用户允许flash。当然,目前我们很多人都会因为所有基于Flash的广告而屏蔽Flash。@TJC同意,但在HTML5普及之前,Flash/ActiveX/Silverlight/XBap是这种情况下唯一可行的选择。诗人:的确,是的。:-)对我来说,我只想做HTML5或服务器端,但肯定有一个选择是HTML5,回退到(此处插入专有技术),回退到服务器端。:-)@TJC——这一直是HTML5和原生JSON等所有新玩具中令人沮丧的一个方面——直到它们无处不在,从生产角度来看,它们只不过是新奇而已。我们仍然支持IE6大声哭出来!酷!但在我的例子中,JS在第二次点击上传按钮后立即写入控制台。怎么了?哦,找到了一个答案:它应该是一个在元素中安装了onclick的onchange事件。无论如何,感谢GajusI在通过iOS Safari上传图像之前使用您的解决方案检查图像的方向(因为iOS在上传过程中会剥离很多exif数据,例如方向)。我发现如果图像显示为“无”(在纵向模式下,它混淆了宽度和高度),那么它的尺寸就错了。我解决这个问题的方法是给它一个绝对位置为左-10000px左右。不管怎样,谢谢你的工作。它使我避免了很多额外的头痛。