Pergunta

Fazer navegadores da web envia o tamanho do arquivo no cabeçalho de http ao fazer o upload de um arquivo para o servidor?E, se for o caso, então, é possível recusar o arquivo apenas lendo o cabeçalho e não esperar que todo o processo de upload para terminar?

Foi útil?

Solução

http://www.faqs.org/rfcs/rfc1867.html

HTTP clientes incentivados a fornecer conteúdo de comprimento geral do arquivo de entrada para que um ocupado server pode detectar se a proposta do arquivo de dados é muito grande para ser processadas razoavelmente

Mas o comprimento de conteúdo não é necessário, portanto, você não pode contar com ele.Além disso, um atacante pode forjar um conteúdo errado de comprimento.

Para ler o conteúdo do arquivo é a única maneira confiável.Tendo dito que, se o content-lenght está presente e é muito grande, para fechar a conexão deve ser uma coisa razoável a fazer.

Além disso, o conteúdo é enviado como multipart, por isso a maioria das modernas estruturas de decodificá-lo primeiro.Isso significa que você não vai obter o arquivo de fluxo de bytes até que o quadro é feito, o que poderia significar "até que todo o arquivo seja carregado".

Outras dicas

EDITAR :antes de ir longe demais, você pode querer verificar para esta outra resposta depender de configuração do apache : Usando jQuery, Restringir o Tamanho do Arquivo Antes de fazer o Upload .a descrição abaixo é útil apenas se você realmente precisar de ainda mais personalizado feedback.

Sim, você pode obter algumas informações iniciais, antes de permitir o upload do arquivo inteiro.

Aqui está um exemplo de cabeçalho vindo de um formulário com o enctype="multipart/form-data" atributo :

POST / HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.3) Gecko/2008092414 Firefox/3.0.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.7,fr-be;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------886261531333586100294758961
Content-Length: 135361

-----------------------------886261531333586100294758961
Content-Disposition: form-data; name=""; filename="IMG_1132.jpg"
Content-Type: image/jpeg

(data starts here and ends with -----------------------------886261531333586100294758961 )

Você tem o Comprimento de Conteúdo no cabeçalho, e além disso, não é o Tipo de Conteúdo no cabeçalho do ficheiro parte ( cada arquivo tem seu próprio cabeçalho, que é o propósito de multipart de codificação ).Cuidado que ele é o navegador responsabilidade de definir um Conteúdo relevante-Tipo de adivinhar o tipo de arquivo ;você não pode garanti-la, mas deve ser bastante confiável para o início de rejeição ( ainda é melhor você verificar o arquivo inteiro quando ele é inteiramente disponível ).

Agora, não é uma pegadinha.Eu costumava filtro de arquivos de imagem, como que, não no tamanho, mas no tipo de conteúdo ;mas como você deseja interromper o pedido o mais breve possível, o mesmo problema se coloca : o navegador só obtém sua resposta, uma vez que todo o pedido é enviado, incluindo o conteúdo do formulário e, assim, upload de arquivos.

Se você não deseja que o conteúdo fornecido e parar de fazer o upload, você não tem escolha, mas para brutalmente fechar o socket.O usuário verá apenas um confuso "conexão redefinida pelo ponto" da mensagem.E isso é uma pena, mas é por design.

Então, você apenas pretende utilizar este método em casos de plano de fundo assíncrona verifica ( usando um timer que verifica o arquivo de campo ).Então, eu tinha esse hack :

  • Eu uso o jquery para me dizer se o arquivo de campo foi alterado
  • Quando um novo arquivo é escolhido, desative todos os outros campos do arquivo no mesmo formulário para obter apenas um.
  • Enviar o arquivo de forma assíncrona ( jQuery pode fazer isso por você, ele usa um quadro oculto )
  • Do lado do servidor, verifique o cabeçalho de comprimento de conteúdo, tipo de conteúdo, ...), cortar a conexão assim que você tem o que você precisa.
  • Definir uma variável de sessão dizendo que o arquivo estava OK ou não.
  • Do lado do cliente, como o arquivo é carregado para um quadro você ainda não receber qualquer tipo de comentário, se a conexão é fechada.A sua única alternativa é um temporizador.
  • Do lado do cliente, um temporizador de consulta o servidor para obter um status para o arquivo carregado.Do lado do servidor, você tem que variável de sessão definido, enviá-lo de volta para o navegador.
  • O cliente tem o código de status ;torná-lo para o formulário :mensagem de erro, marca de verificação verde/vermelho X, qualquer que seja.Repor o ficheiro de campo ou desativar o formulário, você decide.Não se esqueça de re-ativar outros campos do arquivo.

Bastante confuso, hein ?Se algum de vocês tem uma alternativa melhor, sou todo ouvidos.

  1. Não tenho certeza, mas você realmente não deve confiar em nada enviado no cabeçalho, pois ele pode ser falsificado pelo usuário.

  2. Depende de como o servidor funciona. Por exemplo, no PHP, seu script não será executado até que o upload do arquivo seja concluído, portanto isso não seria possível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top