Depois de procurar respostas sobre como baixar arquivos com o Axios no React, implementei o seguinte código:
const [fileName, setFileName] = useState("")
const [extension, setExtension] = useState("")
const downloadFile = useCallback(async (path) => {
Axios.get(
`http://localhost:8080/api${path}`,
{ responseType: 'blob' })
.then(res => {
let headers = res.headers['content-disposition']
let fileName = headers.split('filename=')[1].split('.')[0]
let extension = headers.split('.')[1].split(';')[0]
setFileName(fileName)
setExtension(extension)
return res.data
})
.then(blob => {
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a')
const fullFileName = fileName + "." + extension
link.href = url
link.download = fullFileName;
document.body.appendChild(link)
link.click()
link.remove()
URL.revokeObjectURL(url)
})
.catch(err => console.log(err))
},
[]
)
Eu estava procurando definir o nome do arquivo e a extensão em a useState
no primeiro .then()
e então usá-lo para nomear o arquivo baixado com seu nome original. No entanto, eu vim a ver que ele simplesmente não executa os setters antes da próxima .then()
chamada, então as variáveis fileName
e extension
ainda são strings vazias até então, e ele dá a ele um nome padrão por causa disso. Como eu poderia fazer com que ele passasse os valores corretos para a próxima função na cadeia?