2015-10-10 26 views
5

FileSaver.js kullanarak bir dosyayı indirmeye çalışıyorum, ancak indirme düğmesine bastığımda bozuk bir dosya alıyorum.AngularJs uygulamasında bozuk İndir

Uygulama bir PHP REST hizmeti tarafından desteklenir ve komut satırından cURL kullanılarak REST'in düzgün çalıştığını onaylar. Bu sadece dosya bozarsa

// Let str be the data received from $http promise 
// This code is run in a "then" callback 

var arr= new Uint8Array(str.length); 
for(var i=0; i<str.length; i++) { 
    arr[b]=str.charCodeAt(i); 
}; 
var blob = new Blob([arr], {type: 'application/octet-stream'}); 
saveAs(blob, "AFileName"); 

:

Burada indirilmesi için kullanılacak sözde kodunun son sürümüdür.

Ayrıca, Uint8Array'u uygulamadan ve str'u doğrudan Blob'a göndermeyi denedim. Tahmin ettiğin gibi, başarısız oldu.

Sunucu ve istemci kendim yazıyorum, bu yüzden onlarda bir şeyleri değiştirebilirim. Ancak, istemcinin istemci tarafından karşıdan karşıya yüklenmesini istemiyorum ve REST'in kimlik doğrulaması gerektirdiğinden ve bu belirtecin yalnızca Angular uygulamasında yaşadığı için, kullanıcıları indirmek için dosya URL'sine yönlendiremiyorum. Doğrulama olmadan dosya indirme işlemlerini gerçekleştirmek için sunucuyu değiştirmek iyi bir seçim değildir.

REST, erişildiği zaman dosya içeriğini normal bir HTTP dosyası indirme (yukarıda belirtildiği gibi cURL ile sınanmış) olarak veren /files/:id gibi URL'lere sahiptir. $http sorun olabilir mi? Bir şekilde, alınan veriler üzerinde bir çeşit kodlama veya bazı varsayımlar zorlamak. Zaten Angular'da fazla tecrübem yok.

+0

@ArtjomB Kurallara aykırı "Teşekkürler" deyin mi? – vfsoraki

+0

Şunu söyleyebilirsin: [Merhaba, 'teşekkürler', 'sloganlar ve selamlar yazılardan kaldırılmalı mı?] (Http://meta.stackexchange.com/q/2950/266187), ama gitme ve Bu şeyleri eski gönderiden kaldır. Bu onlara istenmeyen ilgi verebilir. Ayrıca, bunu yaptığınızda, yazıdaki her şeyi düzeltmelisiniz. Bu düzenlemeyi yapmamın nedeni, başka bir kullanıcının soruyu PHP etiketine önerdiğinden, bu parçayı test ettiğini ve işe yaradığını söylediğinden beri yanlış görünüyordu. Daha sonra düzenlemeleri kendimin bir düzenlemesiyle reddettim. –

cevap

5

Sorunu buldum. Bu beni :)

Sonra Blob doğrudan str vermek $http için responseType: "arraybuffer" belirtmek zorunda idi.

Sabit kod

// Let str be the data received from $http promise 
// This code is run in a "then" callback 
// Make sure to specify "responseType: "arraybuffer"" for $http 

var blob = new Blob([str], {type: 'application/octet-stream'}); 
saveAs(blob, "AFileName"); 

ben yanlış yerde responseType değişiyordu.

+0

responseType'ı tam olarak nereye eklediğinizi belirtebilir misiniz? Bu queryObject = $ kaynak gibi ekliyorum (yol, {}, { olsun: { yöntemi:, responseType 'GET': 'arraybuffer' } } }); – Achyut

+0

@Achyut '$ resource' kullanmamıştım,' http $ http' kullanmıştım. "$ Http" parametrelerinin "$ source" a nasıl kaynak gösterileceğini araştırabilirsiniz. – vfsoraki

+0

Harika, teşekkürler. İndirmelerimin neden bozuk olduğunu anlamaya çalışırken çıldırıyordum. – javatutorial