代码之家  ›  专栏  ›  技术社区  ›  Zarel

在谷歌Chrome/Chrome和Safari中拖放文件上传?

  •  68
  • Zarel  · 技术社区  · 16 年前

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

    A Google search for html5 drag-and-drop file uploading -gmail 提供如下信息:

    所有这些指南都使用 FileReader (或者Firefox 3.6已被弃用) getAsBinary ,其他浏览器也不支持)。

    Chromium does not have FileReader . 我正在使用最新的Chromium nightly,它可以拖放上传文件,但不支持 .

    我看到有人提到拖放上传可以通过拖到 <input type="file" /> ,但一次只能支持一个文件,而Gmail的上传程序可以处理多个文件被拖到上面,所以这显然不是他们在做的。

    9 回复  |  直到 9 年前
        1
  •  33
  •   Zarel    10 年前

    警告: 这是非常旧版本的Safari和Chrome的兼容性代码。 https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications


    一种可能是使用 the method used in SwellJS :

    使用 <input type="file" multiple="multiple" /> 像这样:

    <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>
    

    opacity: 0 并且(绝对地)定位在一个接受上传的元素上。整个表单可以放置在 iframe 类似“伪Ajax”的行为。upload元素可以是一个隐藏的层,直到有东西被拖到它上面。

    这样的iframe看起来像:

    <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>
    

    <input type="file" /> 元素),并可与HTML5结合使用 drop

    我不知道这是否是Gmail使用的方法,但它确实也适用。

        2
  •  13
  •   Arnaud Leymet    16 年前

    你可能会对更符合技术和浏览器的东西感兴趣。

    在我看来 Plupload

    • PNG调整大小
    • JPEG调整大小
    • 类型筛选
    • 流上传
    • 文件大小限制
    • 上载进度

    • 闪光
    • HTML 5
    • 银光
    • 浏览器Plus

    是的, since 2010.05.27

        3
  •  10
  •   Casey Chu    16 年前

    我做了很多,很多,很多的侦探工作后,在Chrome上找到了一些东西。这个 只有

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <script type="text/javascript">
                window.onload = function () {
                    var div = document.getElementById('div');
                    div.ondragenter = div.ondragover = function (e) {
                        e.preventDefault();
                        e.dataTransfer.dropEffect = 'copy';
                        return false;
                    }
                    div.ondrop = function (e) {
                        for (var i = 0; i < e.dataTransfer.files.length; i++) { // e.dataTransfer is a DataTransfer object (https://developer.mozilla.org/En/DragDrop/DataTransfer), e.dataTransfer.files is a FileList object (https://developer.mozilla.org/en/DOM/FileList)
                            var file = e.dataTransfer.files[i]; // file is a File object (https://developer.mozilla.org/en/DOM/File)
    
                            var xhr = new XMLHttpRequest;
                            xhr.open('post', 'handler.php', true);
                            xhr.onreadystatechange = function () {
                                if (this.readyState != 4)
                                    return;
                                document.body.innerHTML += '<pre>' + this.responseText + '</pre>';
                            }
                            xhr.setRequestHeader('Content-Type', 'multipart/form-data');
                            xhr.setRequestHeader('X-File-Name', file.fileName);
                            xhr.setRequestHeader('X-File-Size', file.fileSize);
                            xhr.send(file); // For some reason sending the actual File object in Chrome works?
                        }
    
                        e.preventDefault();
                        return false;
                    }
                }
            </script>
        </head>
        <body>
            <div id="div" style="width: 100%; height: 200px; border: 1px solid blue">Drop here</div>
        </body>
    </html>
    

    handler.php:

        // This is not a true file upload. Instead, it sends the raw data directly.
        echo htmlentities(file_get_contents('php://input'));
    
        4
  •  2
  •   Ryan Seddon    16 年前

    您不需要使用iframe来执行伪ajax上传。Chrome和Safari都支持 XHR2 uploads

        5
  •  2
  •   Martin    16 年前

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

    if (typeof(window.File) == 'object' && typeof(window.FileReader) == 'function' && typeof(window.FileList) == 'object') {
       // DnD is supported!
    }
    

        6
  •  2
  •   WOj    15 年前

    您可以使用HTML5上载程序库: http://code.google.com/p/html5uploader/

    它适用于Firefox、Safari和Chrome。

        7
  •  1
  •   summer    15 年前

    最新的浏览器支持文件上传。 您可以使用:

    xhr = new XMLHttpRequest();     
    xhr.open('POST', targetPHP, true);
    var formData = new FormData();
    formData.append('upload',file);
    xhr.send(formData);
    

    我测试了这个代码 client:firefox 6.02 镀铬13。 server:tomcat with “春季mvc”

        8
  •  0
  •   u149796 tai    15 年前

    您可以使用FormData存储文件,然后上载它。例如

    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';
    }
    

    演示在这里(http://flexinnerp.appspot.com/) 尽情享受吧:)

        9
  •  0
  •   Igor Krupitsky    12 年前

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

    使用CSS DropHere类:

    .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;
    }
    

    The file will now look like

    如果您使用asp.net,您可能也会喜欢我写的这篇文章“使用进度条和拖放进行多文件上载”: http://www.codeproject.com/Articles/818561/Multiple-file-upload-with-progress-bar-and-drag-an

    推荐文章