1

Estou criando um script para upload de arquivos que será divido em chunks de acordo com o tamanho do arquivo, criando assim diversas requisições com partes diferentes do arquivo, porém eu gostaria de colocar a opção em que o usuário possa cancelar um upload.

Essa é a função que faz o upload do arquivo:

function uploadFile(e, uploadID){
    var chunks = e.chunks;
    var location = e.location;
    var cnt = 0;
    var end = chunks.length;

    var temp = 
              function callback(cnt){
                    var e = chunks[cnt];
                    var xhr = new XMLHttpRequest();
                    xhr.open("PUT", location, true);
                    xhr.setRequestHeader('Content-Range', e.range);
                    xhr.send(e.data);
                    xhr.onloadend = 
                                function() {
                                            var status = xhr.status;

                                            cnt += 1;

                                            if (status == 308) {
                                                callback(cnt);
                                            } else if (status == 200) {
                                                console.log("Upload feito");
                                            } else {
                                                console.log("Erro: " + xhr.response);
                                            }
                                        };
    }(cnt);
}

Sei que é possível fazer um abort() no objeto para cancelar a requisição, porém como eu poder fazer para cancelar só quando o usuário clicar em um botão? Devo salvar o objeto XMLHttpRequest() em alguma parte para chamar depois ou existe algum tipo de identificador que eu posso usar para cancelar a requisição?

Por exemplo, eu poderia definir uma variável global e salvar o objeto da requisição nela, porém se eu tiver mais de um arquivo sendo upado, como faço para manter o controle de qual requisição deve ser cancelada? Uma vez que a cada novo upload a variável vai ser atualizada com um novo objeto.

1
  • @dvd Eu sei que é possível usar o abort(), meu problema é como fazer para chamá-lo através de um botão? E depois se eu tiver vários arquivos em upload a variável que contem o objeto mudará cada vez que um novo arquivo for enviado. Eu quero saber como reconhecer qual upload deve ser cancelado.
    – Leo Letto
    Commented 24/05/2018 às 17:18

1 Resposta 1

1

Usa o método abort: https://developer.mozilla.org/pt-BR/docs/Web/API/XMLHttpRequest/abort

// a variável deve ser global ou ser passada por parâmetro para a function que irá abortar
var xhrList = [];
function uploadFile(e, uploadID){ 
    // aqui deve haver um id que identifique o arquivo (chamei abaixo de "x")
    var xhr = new XMLHttpRequest();
    xhrList.push({ id: x, obj: xhr});
}

function abortar(id) {
  var xhr = xhrList.find(x => x.id === id).obj;
  xhr.abort();
}

EDIT: editado após a edição da pergunta explicando o cenário para abortar uma requisição em específico.

Basta executar abortar() no click do botão.
Antes de executar o abort verificar o status da requisição em xhr.status : https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/status

8
  • 1
    quem votou negativo pode explicar o que há de inútil ou errado na resposta por gentileza? Commented 24/05/2018 às 17:19
  • Funcionária bem se fosse para fazer o upload de 1 arquivo por vez, se eu tiver mais de 1 arquivo, a cada novo arquivo a var xhr vai ser atualizada com um novo objeto
    – Leo Letto
    Commented 24/05/2018 às 17:19
  • neste caso, quer cancelar todos ou apenas um upload em particular? Commented 24/05/2018 às 17:20
  • 1
    veja a edição que fiz na pergunta. XMLHttpRequest não tem um identificador, mas você pode atribuir um a uma lista ao armazenar a requisição, e excluir essa em particular Commented 24/05/2018 às 17:31
  • 1
    A variável nesse exemplo ainda acaba sendo global. Se precisar acessar de scripts diferentes, todos os scripts precisariam acessar a variável. Sobre salvar é possível, mas isso funciona bem com dados números, textos, ou mesmo classes mais simples. Nesse caso como é um objeto de XMLHttpRequest não sei como funcionaria a serialização, precisaria testar. Nesse caso o localStorage poderia ser uma opção, mas eu ainda tentaria com a variável global. Commented 24/05/2018 às 17:50

Você deve fazer log-in para responder a esta pergunta.

Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag .