Javascript 在Google Chrome/Chrome和Safari中拖放文件上传?

Javascript 在Google Chrome/Chrome和Safari中拖放文件上传?,javascript,ajax,html,Javascript,Ajax,Html,拖放文件上传可以在Firefox3.6中完成 给出如下内容: 所有这些指南都使用FileReader(或者Firefox 3.6不推荐的getAsBinary,其他浏览器也不支持) 然而,谷歌最近发布了一个Gmail更新,允许在Chromium和Firefox中进行拖放文件上传。我每晚都在使用最新的Chromium,它可以拖放上传文件,但不支持FileReader 我看到有人提到拖放上传可以通过拖拽到上实现,但一次只能支持一个文件,而Gmail的上传程序可以处理多个被拖拽到上面的文件,

拖放文件上传可以在Firefox3.6中完成

给出如下内容:

所有这些指南都使用
FileReader
(或者Firefox 3.6不推荐的
getAsBinary
,其他浏览器也不支持)

然而,谷歌最近发布了一个Gmail更新,允许在Chromium和Firefox中进行拖放文件上传。我每晚都在使用最新的Chromium,它可以拖放上传文件,但不支持
FileReader

我看到有人提到拖放上传可以通过拖拽到
上实现,但一次只能支持一个文件,而Gmail的上传程序可以处理多个被拖拽到上面的文件,所以他们显然不是这么做的


所以问题是,他们是如何做到的?你如何支持Chromium上传HTML5文件?此外,您能支持Safari吗?

警告:这是非常旧版本的Safari和Chrome的兼容代码。现代浏览器都支持FileReader API;这里有一个教程:

此代码现在仅在出于某种原因需要支持Safari 5及以上版本或Chrome 6及以上版本时才有用


一种可能性是使用:

像这样使用

<form method="post" enctype="multipart/form-data" id="uploadform">
  <input type="file" name="dragupload[]" multiple="multiple"
  onchange="if (this.value) document.getElementById('uploadform').submit();" />
</form>
这只应该在检测到Safari或Chrome时执行(因为其他浏览器不支持拖放到
元素),并且可以与Firefox 3.6+的HTML5
拖放事件结合使用


我不知道这是否是Gmail使用的方法,但它肯定也能起作用。

经过大量、大量的检测工作,我在Chrome上找到了一些工作。这只适用于Chrome。在狩猎时,它会结冰。在Firefox上,它不允许我删除文件。IE打开删除的文件。即使在Chrome中,由于某种原因,拖放操作也只能工作一次,之后必须刷新页面。(一个可能的原因是事件处理程序有问题。)


您不需要使用iframe来进行伪ajax上传。Chrome和Safari都支持进度事件,因此您可以执行进度条等操作。

您可能对更符合技术和浏览器要求的内容感兴趣

在我看来,它做得很好,支持以下功能:

  • 大块
  • 拖放
  • PNG调整大小
  • JPEG调整大小
  • 类型筛选
  • 流上传
  • 多部分上传
  • 文件大小限制
  • 上传进度
对于以下大多数技术:

  • 闪光
  • 齿轮
  • HTML5
  • 银光
  • BrowserPlus

是的,它支持在Chrome beta上运行的HTML5的拖放操作。

对于我们自己的应用程序,我们只对FireFox进行拖放操作。我们为其他人恢复了传统的iframe上传。为了检测是否支持拖放,我们运行以下代码:

function setUp(){
  var dropContainer = document.getElementById("container");
  dropContainer.addEventListener("drop",dropHandler,false);
  dropContainer.addEventListener("dragenter", function(event){event.stopPropagation();event.preventDefault();}, false);
  dropContainer.addEventListener("dragover", function(event){event.stopPropagation();event.preventDefault();}, false);
  dropContainer.addEventListener("drop", dropHandler, false);
  getResult()
}
function dropHandler(event){
  var files = event.dataTransfer.files;
  var count = files.length;
  form = new FormData();
  for(var i= 0;i<count;i++){
    form.append("file"+i, files[i]);
  }
  sendData();
}
function sendData(){
  var xhr = new XMLHttpRequest();  
  xhr.upload.addEventListener("progress", uploadProgress, false);  
  xhr.addEventListener("load", uploadComplete, false);
  xhr.addEventListener("error", uploadFailed, false);  
  xhr.open("POST", "/upload");
  xhr.send(form);
  var progressBar = document.getElementById('progressBar');
  progressBar.style.display = 'block';
  progressBar.style.width = '0px';
}

希望这对一些人有所帮助。

您可以使用HTML5上传程序库:


它可以与Firefox、Safari和Chrome一起使用。

您可以使用FormData存储文件,然后上传。e、 g

xhr = new XMLHttpRequest();     
xhr.open('POST', targetPHP, true);
var formData = new FormData();
formData.append('upload',file);
xhr.send(formData);
函数设置(){
var dropContainer=document.getElementById(“容器”);
addEventListener(“drop”,dropHandler,false);
dropContainer.addEventListener(“dragenter”,函数(事件){event.stopPropagation();event.preventDefault();},false);
dropContainer.addEventListener(“dragover”,函数(事件){event.stopPropagation();event.preventDefault();},false);
addEventListener(“drop”,dropHandler,false);
getResult()
}
函数dropHandler(事件){
var files=event.dataTransfer.files;
var count=files.length;
form=新FormData();

对于(var i=0;i最新的浏览器支持文件上传良好。 您可以使用:

.DropHere
{
    height: 100px;
    padding: 3px;
    border: 2px dashed #555;
    border-radius: 5px;
    cursor: default;
    background-image:url("data:image/svg+xml;utf8, <svg xmlns='http://www.w3.org/2000/svg' version='1.1' height='100px' width='220px'><text x='55' y='75' font-size='20'>or drop files here</text></svg>");
    background-repeat: no-repeat;
}
您不需要设置边界或任何头部,就像这样它工作得很好。 我在中测试了这段代码 客户端:Firefox6.02和Chrome13。
服务器:带有“spring mvc”的tomcat设置多个属性,如:

输入type=“file”name=“file1”multiple=“multiple”class=“DropHere”

并使用此CSS DropHere类:

。放在这里
{
高度:100px;
填充:3倍;
边框:2个虚线#555;
边界半径:5px;
游标:默认值;
背景图像:url(“数据:image/svg+xml;utf8,或在此处放置文件”);
背景重复:无重复;
}
文件字段现在看起来像:

<script>
<!--
  var entered = 0;
-->
</script>
<body ondragenter="entered++;document.getElementById('uploadelement').style.display='block'" ondragleave="entered--;if (!entered) document.getElementById('uploadelement').style.display='none'">
  <form method="post" enctype="multipart/form-data" id="uploadform">
    Things can be dragged and dropped here!
    <input type="file" id="uploadelement" name="dragupload[]" multiple="multiple" onchange="if (this.value) { document.getElementById('uploadform').submit(); }" style="display:none;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;" />
  </form>
</body>


如果你使用asp.net,你可能也会喜欢我写的这篇文章“带进度条的多文件上传和拖放”:

p.S.阅读源代码是相当困难的,因为Gmail的源代码经过了所有的优化处理后变得非常模糊。p.p.S.HTML
文件列表是只读的,所以你也不能将拖放文件移植到其中一个。有可能更改这篇文章的标题吗?我刚刚发布了一个关于“Chrome”中“拖放”的重复问题,但与这个问题不匹配,因为标题使用了Chrome(大多数人不使用)。好的,我已经更改了标题……是的,这一点很明显。这里的问题是,我看到的所有教程都使用
FileReader
getAsBinary()
(即Chrome不支持的功能)来上传XHR2文件。我怀疑这是必需的,所以我在这里基本上是问如果想要Chrome支持,人们会怎么做。哦?你试过“HTML5运行时”吗HTML5运行时版本适用于我在OS X上的6.0.472.25开发版。它似乎也适用于Firefox 4 betas。HTML5上传工作也适用于我在WinXp上的Chrome 8.552.210测试版(只有几个月,他们有两个版本).无论如何,谢谢你的帖子!对我来说:在html5运行时下,FF 15.0.1可以工作;Chrome 21不能。使用document.body.innerHTML+=销毁
function setUp(){
  var dropContainer = document.getElementById("container");
  dropContainer.addEventListener("drop",dropHandler,false);
  dropContainer.addEventListener("dragenter", function(event){event.stopPropagation();event.preventDefault();}, false);
  dropContainer.addEventListener("dragover", function(event){event.stopPropagation();event.preventDefault();}, false);
  dropContainer.addEventListener("drop", dropHandler, false);
  getResult()
}
function dropHandler(event){
  var files = event.dataTransfer.files;
  var count = files.length;
  form = new FormData();
  for(var i= 0;i<count;i++){
    form.append("file"+i, files[i]);
  }
  sendData();
}
function sendData(){
  var xhr = new XMLHttpRequest();  
  xhr.upload.addEventListener("progress", uploadProgress, false);  
  xhr.addEventListener("load", uploadComplete, false);
  xhr.addEventListener("error", uploadFailed, false);  
  xhr.open("POST", "/upload");
  xhr.send(form);
  var progressBar = document.getElementById('progressBar');
  progressBar.style.display = 'block';
  progressBar.style.width = '0px';
}
xhr = new XMLHttpRequest();     
xhr.open('POST', targetPHP, true);
var formData = new FormData();
formData.append('upload',file);
xhr.send(formData);
.DropHere
{
    height: 100px;
    padding: 3px;
    border: 2px dashed #555;
    border-radius: 5px;
    cursor: default;
    background-image:url("data:image/svg+xml;utf8, <svg xmlns='http://www.w3.org/2000/svg' version='1.1' height='100px' width='220px'><text x='55' y='75' font-size='20'>or drop files here</text></svg>");
    background-repeat: no-repeat;
}