0

通过表单拖动,拖放或选择文件时,IE 9/10/11只接受JPEG和PNG文件,但拒绝扩展JPG和GIF。我在下面使用的代码和演示URL https://css-tricks.com/examples/DragAvatar/都有这个问题。在演示中放置JPG或GIF文件时,IE会抛出一个标题为“网页留言”的消息框,报告“只允许图片!”JPG和GIF如何在IE 9/10/11中拖放工作?

重命名GIF并没有帮助,而将JPG重命名为JPEG确实有效,但是我不想让用户执行此操作。这是一个错误?拖动事件触发时是否可以重命名扩展名?可以做些什么来支持GIF? Chrome和FF没有问题。

reader = new FileReader(); 
reader.onload = (function (theFile) { 
    return function (event) { 
     theHTML = '<img style="width: 100%;" src="' + event.target.result + '" />'; 
     document.getElementById('dropTarget').innerHTML = theHTML; 
    };}(file)); 

reader.readAsDataURL(file); 
+0

不是一个错误。如果我将一个'.jpg'拖放到头像拖放区,那么你在IE11中对css-tricks的链接就可以正常工作。我甚至可以删除一个.gif文件,并且序列的第一个图像将成为头像(画布不支持动画gif)。在你的应用程序中,在失败的尝试中报告了什么file.type? – markE

+0

@markE我得到一个空白的file.type。在这一点上,我已经转向检查文件头,以消除所有疑问。看看Drakes如何在http://stackoverflow.com/questions/18299806/how-to-check-file-mime-type-with-javascript-before-upload – Guessed

回答

0

什么是错的与你的图像(S),如果你得到一个未定义的file.type时,你应该得到某种image.*文件类型。

这里的工作演示,让您的图像拖动到悬浮窗,并用它创建两个图像的一个新的画布绘制:

// dropDiv event handlers 
 
var dropDiv=document.getElementById("dropDiv"); 
 
dropDiv.addEventListener("dragenter", handleDragEnter, false); 
 
dropDiv.addEventListener("dragover", handleDragOver, false); 
 
dropDiv.addEventListener("drop", handleDrop, false); 
 
// 
 
function handleDragEnter(e) { 
 
    e.stopPropagation(); 
 
    e.preventDefault(); 
 
} 
 
// 
 
function handleDragOver(e) { 
 
    e.stopPropagation(); 
 
    e.preventDefault(); 
 
} 
 
// 
 
function handleDrop(e) { 
 
    e.stopPropagation(); 
 
    e.preventDefault(); 
 

 
    var dt = e.dataTransfer; 
 
    var files = dt.files; 
 

 
    handleFiles(files); 
 
} 
 

 
// 
 
function handleFiles(files) { 
 

 
    for (var i=0;i<files.length;i++) { 
 
    var file = files[i]; 
 
    var imageType = /image.*/; 
 

 
    if (!file.type.match(imageType)) { 
 
     continue; 
 
    } 
 

 
    var img = document.createElement("img"); 
 
    img.classList.add("obj"); 
 
    img.file = file; 
 
    preview.appendChild(img); 
 

 
    var reader=new FileReader(); 
 
    reader.onload=(function(aImg){ 
 
     return function(e) { 
 
     aImg.onload=function(){ 
 
      var canvas=document.createElement("canvas"); 
 
      var ctx=canvas.getContext("2d"); 
 
      canvas.width=aImg.width; 
 
      canvas.height=aImg.height; 
 
      ctx.drawImage(aImg,0,0); 
 
      document.body.appendChild(canvas); 
 
     } 
 
     // e.target.result is a dataURL for the image 
 
     aImg.src = e.target.result; 
 
     }; 
 
    })(img); 
 
    reader.readAsDataURL(file); 
 

 
    } // end for 
 

 
} // end handleFiles 
 

 
function calcNewAspect(imgWidth, imgHeight, maxWidth, maxHeight) { 
 
    var ratio = Math.min(maxWidth/imgWidth,maxHeight/imgHeight); 
 
    return {width:imgWidth*ratio,height:imgHeight*ratio }; 
 
}
body{ background-color: ivory; } 
 
canvas{border:1px solid red;} 
 
#dropDiv{border:1px solid blue; width:300px;height:300px;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
<h4>Drag an image from desktop to blue dropzone.</h4> 
 
<div id="dropDiv"></div> 
 
<div id="preview"></div>

+0

谢谢@ markE。我在4台不同的机器上运行了代码片段,并且Vista的IE 9,Windows Server 2003的IE 9和Windows 7的IE 11都失败了。只有Windows Server 2012上的IE 11工作正常。我将不得不坚持阅读魔术数字来积极指出MIME,而不要依赖blob.type测试兼容性。问题不在文件中。问题是测试。 – Guessed

+0

是的,IE9不支持FileReader(在我的代码片段中使用)。 IE10支持FileReader,我可以在Win8上成功拖动IE10 +上的jpg。另外,当你说“通过表单选择文件”是否意味着你正在使用下载属性?下载属性直到IE12-Edge才可用? PS。在Windows Server(s)上测试您的应用程序的荣誉 - 没有多少客户端将从该平台传出,但您彻底了! :-) – markE

+0

实际上,@ markE没有形式,只是一个文件类型的输入元素,对于那些不进行拖放的人来说。禁用Windows Update可能会阻止修复程序在Win8/Server2012之前进入操作系统。我并不打算深入探头嗅探,但现在感谢这种方法的可靠性和轻微的硬化效应 - 而不是黑客不能重写头文件。没关系,但是,因为我没有上传源代码,而是从画布上剪下了一个副本。 – Guessed

0

问题在于既不在使用的FileReader代码也不在选择的文件中。该错误是由在Windows Vista或7上运行的IE 9/10/11中的file.type.match('image。*')测试引起的。JPG和GIF文件报告为JavaScript的空白类型。为了处理这个问题,忽略该文件的扩展名并直接读取该文件的头部以确定其MIME。

要读取文件头,请参阅由Drakes在How to check file MIME type with javascript before upload?的答案