簡體   English   中英

HTML5拖放順序上傳

[英]HTML5 Drag and Drop upload sequentially

我有一個網絡應用程序,正在使用HTML5拖放上傳功能。 這是我第一次使用這項技術,因此我做了一些研究,發現了一個簡單的腳本就可以使它起作用。

一切正常,但我需要腳本不要一次上傳所有文件,而是對每個文件分別提出請求並按順序上傳(我在這里使用了正確的詞嗎?)。

有沒有辦法做到這一點?

謝謝

PS我正在使用PHP作為服務器端語言(不是在這個問題上會有所不同)

這是我一段時間前偶然發現的一些代碼的變體,作為使用DND api和進度條的實驗。 希望能幫助到你。 您正在尋找的核心功能是ajaxSingleFileUploadhandleFileSelect

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <style type="text/css">
            .dropZone {
                position: relative;
                width: 200px;
                height: 200px;
                border-radius: 10px;
                line-height: 200px;
                text-align: center;
                border: dotted 1px gray;
            }
            .dropZoneHover {
                background: gray;
                box-shadow: inset 1px 1px 5px gray;
            }
            .jsProgressBar{
                border:solid 1px rgba(0,0,0,0.3);
                height: 1em;
                border-radius: 1em;
            }
            .jsProgress{
                background-image: linear-gradient(90deg, rgba(255,0,0,0.5), rgba(0,255,0,0.5));
                border-radius: 1em;
            }
        </style>
    </head>
    <body>
    <div id="drop_zone" class="dropZone">Drop files here</div>
    <output id="list"></output>

    <script>
        var $id = function (id) {return document.getElementById(id)};
        Element.prototype.on = Element.prototype.addEventListener;
        CSSStyleDeclaration.prototype.add=function(css){
            var tmpCSS = this.cssText;
            if(typeof css == 'object'){
                for(var o in css){
                    if(Object.prototype.hasOwnProperty.call(css,o)){
                        tmpCSS+=';'+o+':'+css[o]+';';
                    }
                }
            }
            else if(typeof css=='string'){
                tmpCSS+=';'+css+';';
            }
            tmpCSS.replace(/;;;/gi,';').replace(/;;/gi,';');
            this.cssText=tmpCSS;
        };
        Event.prototype.stop = function () {
            this.stopPropagation();
            this.preventDefault();
        };

        function changePercent(progressBar,val){ $id(progressBar).value(val); }

        function ProgressBar(el,width){
            el=$id(el);
            el.classList.add("jsProgressBar");
            var p=document.createElement('div');
            var t=document.createElement('div');
            var fh= Math.round(el.clientHeight*0.9)+'px';
            el.style.add({
                             display: 'inline-block',
                             'box-shadow': 'inset 0 0 5px rgba(0,0,0,0.2)',
                             position: 'relative',
                             padding:0,
                             margin: '0 auto'
                         });
            p.classList.add("jsProgress");
            p.style.add({width:'0',height:'100%'});

            t.style.add({width:'100%','text-align':'center',position:'absolute',top:0,bottom:0,left:0,'font-size':fh,'line-height':(el.clientHeight+'px'),'font-weight':'bold'});

            el.appendChild(p);
            el.appendChild(t);
            el.value=function(val){
                if(typeof val != 'undefined'){
                    val=(val>100)?100:(val<0)?0:val;
                    p.style.width=val+'%';
                    t.innerHTML=(val==0)?'':val+'%';
                    return el;
                }
                return t.innerHTML.replace(/%/g,'');
            };
            return el;
        }
        function _progressCallback(progressBar){
            return function(evt){
                var percent=(evt.loaded/evt.total *100);
                changePercent(progressBar, Math.round(percent));
                //$id('status').innerHTML = Math.round(percent)+'% uploaded... pleas wait';
            }
        }

        function ajaxSingleFileUpload(url, fileData, successCallback, failCallback, progressCallback, abortCallback) {
            var ajax = new XMLHttpRequest(), boundary = "FileUpload" + btoa("" + (Math.random()));
            ajax.open('POST', url);
            ajax.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);
            var blob = fileData.blob;//atob(fileData.blob.split(',')[1]);
            var multipartHeader = ['--' ,
                               boundary ,
                               '\r\nContent-Disposition: form-data; name="file"; filename="' ,
                               fileData.name ,
                               '"\r\nContent-Type: ',
                               fileData.fileType,
                               '\r\n\r\n'].join('');
            var multipartTrailer = ['\r\n--', boundary , '--\r\n'].join('');
            var iaHeader = new Uint8Array(multipartHeader.length);
            for (var c = 0, l = multipartHeader.length; c < l; c++) {
                iaHeader[c] = multipartHeader.charCodeAt(c);
            }
            multipartHeader=iaHeader;

            if(!!progressCallback){ajax.upload.addEventListener('progress',progressCallback,false);}
            if(!!successCallback){ajax.addEventListener('load',successCallback,false);}
            if(!!failCallback){ajax.addEventListener('error',failCallback,false);}
            if(!!abortCallback){ajax.addEventListener('abort',abortCallback,false);}
            ajax.send(new Blob([multipartHeader,blob,multipartTrailer]));
        }

        function handleFileSelect(evt) {
            evt.stop();
            var files = evt.dataTransfer.files; // FileList object.
            // files is a FileList of File objects. List some properties.
            var output=[];
            for (var i = 0, f; f = files[i]; i++) {
                var fileReader = new FileReader();
                fileReader.onload = (function (theFile, id) {
                    return function (e) {
                        var fileData = e.target.result,
                                xFile = {
                                    name:     theFile.name,
                                    fileType: theFile.type,
                                    blob:     fileData
                                };
                        ajaxSingleFileUpload('fileUpload.php', xFile,undefined,undefined,_progressCallback('progress'+id));
                        var img = document.createElement('img');
                        img.title = theFile.name;
                        img.id = 'thumb' + id;
                        img.src = fileData;
                        if (img.width > img.height) {
                            img.style.width = (img.width > 60 ? '60' : img.width) + 'px';
                        }
                        else {
                            img.style.height = (img.height > 60 ? '60' : img.height) + 'px';
                        }
                        $id('list').insertBefore(img, null);
                    }
                })(f, i);

                fileReader.readAsArrayBuffer(f);
                output.push('<div><strong>', f.name, '</strong> (', f.type || 'n/a', ') - ',
                            f.size, ' bytes, last modified: ',
                            f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                            '</div><div id="progress'+i+'" style="width:200px;height:15px;"></div>');
            }
            document.getElementById('list').innerHTML = output.join('');
            for(i=0;i<files.length;i++){
                ProgressBar('progress'+i);
            }
        }

        function handleDragOver(evt) {
            evt.stop();
            evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
        }
        var dropZone = $id('drop_zone');

        function handleDragOver2(evt) {
            dropZone.classList.add('dropZoneHover');
        }
        function handleDragLeave2(evt) {
            dropZone.classList.remove('dropZoneHover');
        }

        // Setup the dnd listeners.
        dropZone.on('dragover', handleDragOver, false);
        dropZone.on('dragover', handleDragOver2, false);
        dropZone.on('dragleave', handleDragLeave2, false);
        dropZone.on('drop', handleFileSelect, false);
        dropZone.on('drop', handleDragLeave2, false);
    </script>

    </body>
    </html>

對於PHP方面(您必須使用所需的路徑修改testUploads):

    <?php
    $fileName=$_FILES['file']['name'];
    $fileTmpLoc=$_FILES['file']['tmp_name'];
    $fileType=$_FILES['file']['type'];
    $fileSize=$_FILES['file']['error'];

    if(!$fileTmpLoc){
      //file not chosen
      echo 'Error: Please browse for a file before clicking the upload button.';
      exit();
    }

    if(move_uploaded_file($fileTmpLoc,"testUploads/$fileName")){
      echo "$fileName upload is complete.";
    }
    else{
      echo "Unable to save the file on the server.";
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM