2015-10-10 17 views
5

Tôi đang cố gắng tải xuống tệp bằng cách sử dụng FileSaver.js, nhưng tôi nhận được tệp bị hỏng bất cứ khi nào tôi nhấn nút tải xuống.Tải xuống bị hỏng trong ứng dụng AngularJs

Ứng dụng được hỗ trợ bởi dịch vụ REST PHP và việc sử dụng cURL từ dòng lệnh xác nhận rằng REST đang hoạt động OK.

Đây là phiên bản cuối cùng của pseudo-code mà tôi sử dụng để tải về:

// 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"); 

Nó chỉ corrupts file.

Tôi cũng đã thử mà không cần áp dụng Uint8Array và cấp trực tiếp str cho Blob. Như bạn đã đoán, nó cũng thất bại.

Tôi đang viết máy chủ và máy khách, vì vậy tôi có thể thay đổi bất kỳ thứ gì trong đó. Nhưng vấn đề là tôi muốn xử lý tải xuống phía máy khách và tôi không thể chuyển hướng người dùng đến tệp URL để tải xuống, vì REST cần xác thực và mã thông báo đó chỉ tồn tại trong ứng dụng Góc. Nó sẽ không phải là một lựa chọn tốt để thay đổi máy chủ chỉ để xử lý tải tập tin mà không cần xác thực.

REST có URL như /files/:id khi truy cập, cung cấp nội dung tệp dưới dạng tệp tải xuống HTTP thông thường (được kiểm tra bằng cURL như đã nói ở trên). Có thể $http là sự cố không? Bằng cách nào đó buộc một số loại mã hóa hoặc một số giả định về dữ liệu nhận được. Tôi không có nhiều kinh nghiệm trong Angular, dù sao đi nữa.

+0

@ArtjomB Có nội dung "Cảm ơn" chống lại các quy tắc tại đây không? – vfsoraki

+0

Bạn có thể nói rằng: [Nên 'Chào', 'cảm ơn', khẩu hiệu và lời chào được xóa khỏi bài đăng?] (Http://meta.stackexchange.com/q/2950/266187), nhưng đừng đi và xóa những thứ này khỏi bài đăng cũ. Điều đó có thể khiến họ chú ý không mong muốn. Ngoài ra, khi bạn thực hiện việc này, bạn nên sửa mọi thứ trong bài đăng. Lý do tôi thực hiện chỉnh sửa này là vì một người dùng khác đã đề xuất thẻ PHP cho câu hỏi của bạn có vẻ sai vì bạn đã nói rằng bạn đã thử nghiệm phần đó và nó hoạt động. Sau đó tôi từ chối chỉnh sửa của họ với bản chỉnh sửa của riêng tôi. –

Trả lời

5

Tôi đã tìm thấy sự cố. Đó là tôi :)

Tôi phải chỉ định responseType: "arraybuffer" cho $http sau đó cung cấp str trực tiếp đến Blob.

cố định đang

// 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"); 

tôi đã thay đổi responseType tại chỗ sai.

+0

Bạn có thể chỉ định chính xác nơi bạn đã thêm responseType không. Tôi thêm nó như queryObject = $ resource (path, {}, { get: { phương thức: 'GET', responseType: 'arraybuffer' } } }); – Achyut

+0

@Achyut Tôi không sử dụng '$ resource', tôi đã sử dụng' $ http'. Bạn có thể tìm kiếm cách đưa các tham số '$ http' vào' $ resource' mà tôi nghĩ. – vfsoraki

+0

Tuyệt vời, cảm ơn. Tôi đã phát điên cố gắng tìm hiểu tại sao tải xuống của tôi bị hỏng. – javatutorial

Các vấn đề liên quan