Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Content-Disposition. Essa informação é essencial para salvar o arquivo com o nome original, melhorando a experiência do usuário. Porém, devido às políticas de CORS, o acesso a certos cabeçalhos, como Content-Disposition, é bloqueado por padrão, o que impede de recuperá-lo diretamente na resposta.
Content-Disposition não é acessível na resposta da Fetch API é a restrição de CORS. Quando o servidor não expõe explicitamente esse cabeçalho, o navegador impede que o JavaScript acesse seu conteúdo, por questões de segurança. Assim, mesmo que o servidor envie o cabeçalho corretamente, ele não estará disponível para o client-side, resultando em null ao tentar lê-lo com response.headers.get("content-disposition").
Content-Disposition. Para isso, o servidor deve incluir na resposta a seguinte diretiva:
Access-Control-Expose-Headers: Content-Disposition
Essa configuração permite que o browser libere o acesso ao cabeçalho para scripts JavaScript, possibilitando sua leitura via Fetch.
No lado do servidor, a implementação pode variar, mas o conceito é o mesmo: garantir que o cabeçalho seja enviado e listado na resposta de controle de acesso. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
public IHttpActionResult GetFile()
{
var result = new FileResult("meuarquivo.txt", "Conteúdo do arquivo"). var response = result.Execute(). response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition"). return response. } O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Assim, na resposta do fetch, você consegue acessar o cabeçalho normalmente: 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.
fetch(_url)
.then(response => {
if (response.ok) {
console.log(response.headers.get("content-disposition")). // Agora acessível
return response.blob(). }
throw new Error("Erro na requisição")
})
.then(blob => {
const filename = response.headers.get("content-disposition")
? response.headers.get("content-disposition").split('filename=')[1]
: 'arquivo'. const url = URL.createObjectURL(blob). // código para salvar o arquivo
}). 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. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Outro ponto importante é verificar se o cabeçalho Content-Disposition sempre vem corretamente definido pelo servidor. Em ambientes com múltiplas APIs ou sistemas legados, isso pode variar. 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.
Access-Control-Expose-Headers: Content-Disposition.
2. Faça a requisição usando Fetch e leia o cabeçalho de content-disposition.
3. Extraia o nome do arquivo do valor do cabeçalho, geralmente usando split ou regex.
4. Use URL.createObjectURL() para criar o link de download.
5. Teste em diferentes navegadores, pois o suporte a CORS pode variar.
Ao seguir esses passos, a recuperação do nome do arquivo ao fazer download via Fetch API torna-se viável, mesmo em ambientes com restrições de CORS. Assim, é possível oferecer uma experiência de download mais amigável e alinhada às expectativas do usuário. 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.
O detalhe que pouca gente coloca na conta é risco. Dá para animar com javascript, mas alguém vai ter que sustentar isso no dia a dia.
Tem valor, só não compraria como regra geral. Precisa ficar claro quem opera, quem revisa e o que acontece quando falha.
Já passei por algo parecido. No papel javascript parecia simples. na prática pesou em experiência do usuário.
Já vi esse tipo de aposta funcionar quando existia um responsável claro e um limite bem definido. Quando entra como iniciaitva meio solta, o ganho some rápido.
Boa discussão para trazer exemplos reais. O que funcionou em um produto pequeno pode não sobreviver em uma base grande e cheia de dependências.