A opção de arrastar e soltar uma pasta no Chrome já está disponível

Eiji Kitamura
Eiji Kitamura

Com a evolução dos aplicativos da Web, talvez você tenha achado útil permitir que os usuários arrastem e soltem arquivos da área de trabalho no navegador para editar, fazer upload, compartilhar etc. Mas, infelizmente, não conseguimos arrastar e soltar pastas em páginas da Web. Felizmente, a partir do Chrome 21, esse problema será resolvido (já disponível no Canal de Desenvolvedor do Chrome).

Transmitir vários arquivos com o recurso de arrastar e soltar

Vejamos um exemplo de código do recurso de arrastar e soltar.

<div id="dropzone"></div>
var dropzone = document.getElementById('dropzone');
dropzone.ondrop = function(e) {
    var length = e.dataTransfer.files.length;
    for (var i = 0; i < length; i++) {
    var file = e.dataTransfer.files[i];
    ... // do whatever you want
    }
};

Neste exemplo, é possível arrastar e soltar um ou mais arquivos da área de trabalho para o navegador, mas quando você tentar transmitir uma pasta, ela vai ser rejeitada ou tratada como um objeto File, resultando em falha.

Como lidar com pastas descartadas

O Chrome 21 permite que você solte uma ou várias pastas na janela do navegador. Para lidar com isso, você precisa mudar a maneira como lida com objetos soltos.

<div id="dropzone"></div>
var dropzone = document.getElementById('dropzone');
dropzone.ondrop = function(e) {
    var length = e.dataTransfer.items.length;
    for (var i = 0; i < length; i++) {
    var entry = e.dataTransfer.items[i].webkitGetAsEntry();
    if (entry.isFile) {
        ... // do whatever you want
    } else if (entry.isDirectory) {
        ... // do whatever you want
    }
    }
};

Uma grande diferença aqui é que você pode tratar um objeto solto como Entry (FileEntry ou DirectoryEntry) usando a nova função chamada getAsEntry (webkitGetAsEntry). Depois de conseguir acesso ao objeto Entry, você pode usar os métodos padrão de processamento de arquivos introduzidos na especificação da API FileSystem. Por exemplo, este exemplo mostra como detectar se um objeto solto é um arquivo ou um diretório examinando o campo .isFile (ou .isDirectory).

Para mais informações sobre a API FileSystem, leia este documento (em inglês) e leia sobre o novo recurso de arrastar e soltar Como explorar as APIs FileSystem. É claro que esses recursos são padrões abertos ou estão aguardando para se tornarem um em breve.