Não consigo fazer download, Content-Disposition é nulo

Então … estou tentando resolver um problema relacionado a download de arquivos.

Uso Spring (com Security) no backend. Uso JQuey no Front.

Ocorre que na resposta (no Front) está falhando a recuperação do cabeçalho “Content-Disposition” (jqXHR.getResponseHeader(“Content-Disposition”) é igual a null). É importante acessar esse cabeçalho para que eu possa recuperar o nome do arquivo (é uma imagem).

O estranho é que se observar os cabeçalhos da resposta HTTP por meio do console de depuração do browser o “Content-Disposition” está lá (inclusive a imagem aparece). Mesmo assim, a lógica no meu código não consegue acessar o cabeçalho.

$.ajax({
	url: backend+"/noauthe/filemngr/Download",
	type: "POST",
	cache: false,
	headers: { 'Content-Type':'image/jpeg' },
	responseType:'arraybuffer',
	data: JSON.stringify(fileDescriptor)
}).success(function(data, textStatus, jqXHR) {
	var downloadBlob = document.createElement("a");
	downloadBlob.href = URL.createObjectURL(new Blob([data], {type: jqXHR.getResponseHeader("Content-Type")}));
	downloadBlob.download = jqXHR.getResponseHeader("Content-Disposition").split("=")[1].trim();
	document.body.appendChild(downloadBlob);
	downloadBlob.click();
	document.body.removeChild(downloadBlob);
}).fail(function(jqXHR, textStatus, errorThrown) {
	console.log('[ERROR]');
	console.log(jqXHR);
});

Alguém saca como resolve isso? Já li um bocado tentando encontrar o erro e … nada! :confused:

Acho importante … essas chamdas ocorrem por meio de uso de cabeçalhos CROS e HTTPS

Realmente precisa fazer download por ajax? Senão, faça o que é mais simples: http://keylesson.com/index.php/2015/06/25/spring-mvc-file-download-example-2119/

Substitua a linha

}).success(function(data, textStatus, jqXHR) {

por

}).success(function(data, status, headers) {

agora crie um variável local no seu metódo, dentro de success, estou abstraindo que o seu promisse retorna com sucesso da requisição realizada, atribua o valor do atributo ao qual deseja do header a essa variável criada.

Exemplo:

var contentDisposition = headers("Content-Disposition");

debug e veja o valor de **contentDisposition**
1 curtida

Olha … é sim. é preciso fazer em js/ajax. de todo modo, agradeço a ajuda …

Cara … valeu aí pela dica. Mas fiz como vc recomendou … e agora quanto faço headers()[‘Content-disposition’] ou headers()[‘Content-Type’] vem null para ambos. antes era null apenas para Disposition. Bom, tou estudando … se estiver fazendo errado … ficarei grato pela correção.

flwss…

ps.: como vejo a condição de sucesso do promise?

fiz assim como vc sugere e nada … continua tudo na mesma. na verdade o erro que dah ao usar headers(“Content-Disposition”) é que headers nao eh uma funcao. de fato, é um objeto.

Tenta fazer novamente com headers() mas com javascript mesmo, sem jquery.

function seuMetodo(){
          return downloadService().success(function(data, status, headers) {
                //coloque um breakpoint na linha abaixo
                 var contentDisposition = headers("Content-Disposition");
          }).error(function(data, status) {
              $log.error('Erro na requisição: ' + status + ' dados: ' + JSON.stringify(data));
          });
 };

function downloadService() {
            return $http.get(backend + '/noauthe/filemngr/Download/');
 };

outro jeito é força uma requisição sincrona com AJAX nativo sem Jquery, para você testar também. você pode colocar o código abaixo como assincrono também se assim desejar, mas para ser mais rápido vamos deixar isso de lado é forçar sincrono.

function download(nomeImagem){
			var URL = backend + '/noauthe/filemngr/Download/';
			var http = new XMLHttpRequest();
			http.open('GET', URL, false);
			http.send();
			if(http.status != 200 && http.status == 404){
				//sucesso
			}else{
				//erro na requisição
			}
			return URL;
}

Cara … ontem pela manhã havia feito isso. Funcionou. Vc sabe pq com o jquery dah esse erro?! Fiquei encafifado … de todo modo vlwss pela dica!