É possível obter o progresso de um XMLHttpRequest (bytes carregados, bytes baixados)?
Isso seria útil para mostrar uma barra de progresso quando o usuário estiver carregando um arquivo grande. A API padrão não parece suportá-la, mas talvez haja alguma extensão fora do padrão em qualquer navegador? Parece um recurso bastante óbvio, afinal, já que o cliente sabe quantos bytes foram carregados / baixados.
nota: estou ciente da alternativa "pesquisar no servidor para obter progresso" (é o que estou fazendo agora). o principal problema com isso (que não seja o código complicado do lado do servidor) é que, normalmente, ao fazer o upload de um arquivo grande, a conexão do usuário é completamente integrada, porque a maioria dos ISPs oferece um upstream ruim. Portanto, fazer solicitações extras não é tão responsivo quanto eu esperava. Eu esperava que houvesse uma maneira (talvez não-padrão) de obter essas informações, que o navegador sempre possui.
fonte
O Firefox suporta eventos de progresso de download do XHR .
fonte
Uma das abordagens mais promissoras parece estar abrindo um segundo canal de comunicação de volta ao servidor para perguntar quanto da transferência foi concluída.
fonte
Firefox 3.5 suportará evento de progresso de upload
fonte
Para o total carregado, não parece haver uma maneira de lidar com isso, mas há algo semelhante ao que você deseja baixar. Depois que o readyState for 3, você poderá consultar periodicamente o responseText para obter todo o conteúdo baixado até uma String (isso não funciona no IE), até que todo esteja disponível; nesse momento, ele fará a transição para o readyState 4. O total os bytes baixados a qualquer momento serão iguais ao total de bytes na cadeia armazenada em responseText.
Para uma abordagem tudo ou nada da pergunta de upload, já que você precisa passar uma string para upload (e é possível determinar o total de bytes disso), o total de bytes enviados para readyState 0 e 1 será 0 e o total para readyState 2 será o total de bytes na string que você digitou. O total de bytes enviados e recebidos no readyState 3 e 4 será a soma dos bytes na string original mais o total de bytes no responseText.
fonte
fonte
Se você tiver acesso à instalação do apache e confiar no código de terceiros, poderá usar o módulo de progresso do upload do apache (se você usar o apache; também há um módulo de progresso do upload do nginx ).
Caso contrário, você teria que escrever um script que possa atingir fora da banda para solicitar o status do arquivo (verificando o tamanho do arquivo tmp, por exemplo).
Acredito que há algum trabalho em andamento no firefox 3 para adicionar suporte ao progresso de upload no navegador, mas isso não entrará em todos os navegadores e será amplamente adotado por um tempo (mais é uma pena).
fonte
A única maneira de fazer isso com javascript puro é implementar algum tipo de mecanismo de pesquisa. Você precisará enviar solicitações ajax em intervalos fixos (a cada 5 segundos, por exemplo) para obter o número de bytes recebidos pelo servidor.
Uma maneira mais eficiente seria usar o flash. O componente flex FileReference envia periodicamente um evento 'progress' contendo o número de bytes já carregados. Se você precisar usar o javascript, há pontes disponíveis entre o actionscript e o javascript. A boa notícia é que este trabalho já foi feito para você :)
swfupload
Essa biblioteca permite registrar um manipulador de javascript no evento de progresso do flash.
Esta solução tem a vantagem de não exigir recursos adicionais no lado do servidor.
fonte