|
503 | 503 | return ts; |
504 | 504 | } |
505 | 505 |
|
| 506 | + function entriesToFiles(entries, onDone) { |
| 507 | + var files = []; |
| 508 | + var len = entries.length; |
| 509 | + var cb = 0; |
| 510 | + |
| 511 | + function increaseCb() { |
| 512 | + cb++; |
| 513 | + if (cb === len) { |
| 514 | + onDone(files); |
| 515 | + } |
| 516 | + } |
| 517 | + |
| 518 | + entries.forEach(function (entry) { |
| 519 | + if (entry.isFile) { |
| 520 | + var relativePath = entry.fullPath; |
| 521 | + if (relativePath[0] === '/') { |
| 522 | + relativePath = relativePath.substring(1); |
| 523 | + } |
| 524 | + entry.file(function (file) { |
| 525 | + files.push({file: file, relativePath: relativePath}); |
| 526 | + increaseCb(); |
| 527 | + }, function (err) { |
| 528 | + increaseCb(); |
| 529 | + typeof console !== strUndef && console.error(err); |
| 530 | + }); |
| 531 | + } else { |
| 532 | + var reader = entry.createReader(); |
| 533 | + reader.readEntries(function (subEntries) { |
| 534 | + if (subEntries.length) { |
| 535 | + entriesToFiles(subEntries, function (subFiles) { |
| 536 | + Array.prototype.push.apply(files, subFiles); |
| 537 | + increaseCb(); |
| 538 | + }); |
| 539 | + } else { |
| 540 | + increaseCb(); |
| 541 | + } |
| 542 | + }); |
| 543 | + } |
| 544 | + }); |
| 545 | + } |
| 546 | + |
| 547 | + function itemsToFiles(dataTransferItems, onDone) { |
| 548 | + var entries = []; |
| 549 | + for (var i = 0, len = dataTransferItems.length; i < len; i++) { |
| 550 | + var entry = dataTransferItems[i].webkitGetAsEntry(); |
| 551 | + entries.push(entry); |
| 552 | + } |
| 553 | + entriesToFiles(entries, onDone); |
| 554 | + } |
| 555 | + |
| 556 | + function itemsHasDir(dataTransferItems) { |
| 557 | + if (!dataTransferItems) { |
| 558 | + return false; |
| 559 | + } |
| 560 | + var hasDir = false; |
| 561 | + var items = Array.prototype.slice.call(dataTransferItems); |
| 562 | + if (items.length && items[0].webkitGetAsEntry) { |
| 563 | + for (var i = 0, len = items.length; i < len; i++) { |
| 564 | + var entry = items[i].webkitGetAsEntry(); |
| 565 | + if (entry.isDirectory) { |
| 566 | + hasDir = true; |
| 567 | + break; |
| 568 | + } |
| 569 | + } |
| 570 | + } |
| 571 | + return hasDir; |
| 572 | + } |
| 573 | + |
| 574 | + function switchToFileMode() { |
| 575 | + if (optFile && optActive !== optFile) { |
| 576 | + optFile.focus(); |
| 577 | + optFile.click(); |
| 578 | + } |
| 579 | + } |
| 580 | + |
| 581 | + function switchToDirMode() { |
| 582 | + if (!optDirFile && !optInnerDirFile) { |
| 583 | + return; |
| 584 | + } |
| 585 | + if (optActive === optFile) { |
| 586 | + if (optDirFile) { |
| 587 | + optDirFile.focus(); |
| 588 | + optDirFile.click(); |
| 589 | + } else if (optInnerDirFile) { |
| 590 | + optInnerDirFile.focus(); |
| 591 | + optInnerDirFile.click(); |
| 592 | + } |
| 593 | + } |
| 594 | + } |
| 595 | + |
506 | 596 | function enableAddDir() { |
507 | 597 | var classHidden = 'hidden'; |
508 | 598 | var classActive = 'active'; |
|
715 | 805 | } |
716 | 806 | } |
717 | 807 |
|
718 | | - function entriesToFiles(entries, onDone) { |
719 | | - var files = []; |
720 | | - var len = entries.length; |
721 | | - var cb = 0; |
722 | | - |
723 | | - function increaseCb() { |
724 | | - cb++; |
725 | | - if (cb === len) { |
726 | | - onDone(files); |
727 | | - } |
728 | | - } |
729 | | - |
730 | | - entries.forEach(function (entry) { |
731 | | - if (entry.isFile) { |
732 | | - var relativePath = entry.fullPath; |
733 | | - if (relativePath[0] === '/') { |
734 | | - relativePath = relativePath.substring(1); |
735 | | - } |
736 | | - entry.file(function (file) { |
737 | | - files.push({file: file, relativePath: relativePath}); |
738 | | - increaseCb(); |
739 | | - }, function (err) { |
740 | | - increaseCb(); |
741 | | - typeof console !== strUndef && console.error(err); |
742 | | - }); |
743 | | - } else { |
744 | | - var reader = entry.createReader(); |
745 | | - reader.readEntries(function (subEntries) { |
746 | | - if (subEntries.length) { |
747 | | - entriesToFiles(subEntries, function (subFiles) { |
748 | | - Array.prototype.push.apply(files, subFiles); |
749 | | - increaseCb(); |
750 | | - }); |
751 | | - } else { |
752 | | - increaseCb(); |
753 | | - } |
754 | | - }); |
755 | | - } |
756 | | - }); |
757 | | - } |
758 | | - |
759 | | - function itemsToFiles(items, onDone) { |
760 | | - var entries = []; |
761 | | - for (var i = 0, len = items.length; i < len; i++) { |
762 | | - var entry = items[i].webkitGetAsEntry(); |
763 | | - entries.push(entry); |
764 | | - } |
765 | | - entriesToFiles(entries, onDone); |
766 | | - } |
767 | | - |
768 | 808 | function onDrop(e) { |
769 | 809 | e.stopPropagation(); |
770 | 810 | e.preventDefault(); |
|
778 | 818 | return; |
779 | 819 | } |
780 | 820 |
|
781 | | - var hasDir = false; |
782 | | - if (e.dataTransfer.items) { |
783 | | - var items = Array.prototype.slice.call(e.dataTransfer.items); |
784 | | - if (items.length && items[0].webkitGetAsEntry) { |
785 | | - for (var i = 0, len = items.length; i < len; i++) { |
786 | | - var entry = items[i].webkitGetAsEntry(); |
787 | | - if (entry.isDirectory) { |
788 | | - hasDir = true; |
789 | | - break; |
790 | | - } |
791 | | - } |
792 | | - } |
793 | | - } |
794 | | - |
795 | | - if (hasDir) { |
| 821 | + if (itemsHasDir(e.dataTransfer.items)) { |
796 | 822 | if (!uploadProgressively) { |
| 823 | + // must use progressive upload by JS if has directory |
797 | 824 | return; |
798 | 825 | } |
799 | | - if (!optDirFile && !optInnerDirFile) { |
800 | | - return; |
801 | | - } |
802 | | - if (optActive === optFile) { |
803 | | - if (optDirFile) { |
804 | | - optDirFile.focus(); |
805 | | - optDirFile.click(); |
806 | | - } else if (optInnerDirFile) { |
807 | | - optInnerDirFile.focus(); |
808 | | - optInnerDirFile.click(); |
809 | | - } |
810 | | - } |
| 826 | + switchToDirMode(); |
811 | 827 | btnSubmit.disabled = true; // disable earlier |
812 | 828 | itemsToFiles(e.dataTransfer.items, function (files) { |
813 | 829 | uploadProgressively(files); |
814 | 830 | }); |
815 | 831 | } else { |
816 | | - if (optFile && optActive !== optFile) { |
817 | | - optFile.focus(); |
818 | | - optFile.click(); |
819 | | - } |
| 832 | + switchToFileMode(); |
820 | 833 |
|
821 | 834 | if (uploadProgressively) { |
822 | 835 | var files = Array.prototype.slice.call(e.dataTransfer.files); |
|
839 | 852 | document.documentElement.addEventListener('paste', function (e) { |
840 | 853 | var data = e.clipboardData; |
841 | 854 | if (data && data.files && data.files.length) { |
842 | | - if (optFile && optActive !== optFile) { |
843 | | - optFile.focus(); |
844 | | - optFile.click(); |
845 | | - } |
| 855 | + switchToFileMode(); |
846 | 856 | fileInput.files = data.files; |
847 | 857 | form.submit(); |
848 | 858 | } |
|
853 | 863 | var typeTextPlain = 'text/plain'; |
854 | 864 |
|
855 | 865 | function uploadPastedFiles(files) { |
856 | | - if (optFile && optActive !== optFile) { |
857 | | - optFile.focus(); |
858 | | - optFile.click(); |
859 | | - } |
860 | | - |
| 866 | + switchToFileMode(); |
861 | 867 | var ts = getTimeStamp(); |
862 | 868 | files = files.map(function (f, i) { |
863 | 869 | var filename = f.name; |
|
0 commit comments