Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Quando utilizamos a Fetch API para baixar arquivos gerados pelo servidor, um dos desafios mais comuns é recuperar o nome do arquivo que o servidor definiu, especialmente quando este é enviado na header 'Content-Disposition'. Apesar de parecer uma tarefa simples, na prática ela esbarra em limitações do CORS e na maneira como o navegador expõe headers às aplicações client-side.
Neste artigo, vamos explorar a fundo como fazer essa recuperação de forma robusta, abordando as dificuldades técnicas, estratégias de implementação e boas práticas para garantir que o usuário receba o arquivo com o nome correto, independente do ambiente ou limitações do navegador.
O primeiro ponto a entender é que, por padrão, os headers HTTP que não são considerados 'simples' ou que não fazem parte do conjunto de headers acessíveis via JavaScript, podem estar bloqueados devido às regras de CORS. Assim, mesmo que o servidor envie o header 'Content-Disposition' contendo o filename, o fetch pode não conseguir acessá-lo se não estiver explicitamente exposto. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
No cenário comum, a resposta do servidor deve incluir a diretiva 'Access-Control-Expose-Headers', permitindo que headers específicos, como 'Content-Disposition', sejam acessados pela aplicação cliente. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Por exemplo:
Access-Control-Expose-Headers: Content-Disposition
Se essa diretiva não estiver presente, o método response.headers.get('Content-Disposition') retornará null, tornando impossível extrair o filename desejado.
#### 1. Configurar o servidor para expor o header
Antes de qualquer implementação no cliente, é fundamental garantir que o servidor envie a diretiva mencionada acima. Essa configuração depende da tecnologia de backend utilizada, mas o princípio é universal: incluir 'Access-Control-Expose-Headers' na resposta. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
#### 2. Ler o header 'Content-Disposition' no cliente
Com o header exposto, podemos fazer o fetch normalmente e acessar o 'Content-Disposition'. Exemplo de código: Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
const _url = "URL_DO_ARQUIVO". const initParms = { method: "GET", mode: 'cors' }. fetch(_url, initParms)
.then(response => {
if (response.ok) {
const contentDisposition = response.headers.get("Content-Disposition"). let filename = "arquivo". if (contentDisposition) {
const filenameMatch = contentDisposition.match(/filename="?([^\s. ]+)"?/i). if (filenameMatch && filenameMatch[1]) {
filename = filenameMatch[1]. }
} O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
return response.blob().then(blob => ({ blob, filename })). }
throw new Error("Erro na requisição")
})
.then(({ blob, filename }) => {
const url = URL.createObjectURL(blob). const a = document.createElement('a'). a.href = url. a.download = filename. document.body.appendChild(a). a.click(). a.remove(). URL.revokeObjectURL(url). })
.catch(console.error). Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
A expressão regular busca extrair o nome do arquivo da header, que costuma estar no formato attachment. filename="nome.ext". Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
#### 3. Limitações e cuidados
Em sistemas onde o download de arquivos é frequente, implementar essa lógica garante uma experiência mais fluida ao usuário. Além disso, ao integrar com sistemas de geração de relatórios ou exportação de dados, garantir o filename correto evita confusões na organização dos arquivos. A decisão fica mais saudável quando o time consegue medir o impacto depois. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Um exemplo comum é uma aplicação de dashboards que gera relatórios dinâmicos. Quando o usuário solicita o download, a aplicação deve assegurar que o arquivo seja salvo com o nome provido pelo servidor, que pode incluir data, hora, ou identificadores relevantes. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Essa abordagem garante que o download seja adaptável às limitações atuais dos navegadores e às configurações de segurança, proporcionando uma melhor experiência ao usuário final. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Carregando comentários...