Tôi đang cố tải lên các tệp lớn (ít nhất 500MB, tốt nhất là tối đa một GB) bằng API WebSocket. Vấn đề là tôi không thể tìm ra cách để viết "gửi lát này của tập tin, phát hành các nguồn lực được sử dụng sau đó lặp lại". Tôi đã hy vọng tôi có thể tránh sử dụng một cái gì đó như Flash/Silverlight cho việc này.Tải lên tệp lớn với WebSocket
Hiện nay, tôi đang làm việc với một cái gì đó dọc theo dòng:
function FileSlicer(file) {
// randomly picked 1MB slices,
// I don't think this size is important for this experiment
this.sliceSize = 1024*1024;
this.slices = Math.ceil(file.size/this.sliceSize);
this.currentSlice = 0;
this.getNextSlice = function() {
var start = this.currentSlice * this.sliceSize;
var end = Math.min((this.currentSlice+1) * this.sliceSize, file.size);
++this.currentSlice;
return file.slice(start, end);
}
}
Sau đó, tôi sẽ tải lên sử dụng:
function Uploader(url, file) {
var fs = new FileSlicer(file);
var socket = new WebSocket(url);
socket.onopen = function() {
for(var i = 0; i < fs.slices; ++i) {
socket.send(fs.getNextSlice()); // see below
}
}
}
Về cơ bản này trả về ngay lập tức, bufferedAmount là không thay đổi (0) và nó tiếp tục lặp lại và thêm tất cả các lát vào hàng đợi trước khi cố gắng gửi nó; không có socket.afterSend để cho phép tôi xếp hàng đúng cách, đó là nơi tôi bị kẹt.
Giả sử tôi không muốn phụ thuộc vào Flash/Silverlight, tôi nên sử dụng những gì? XMLHttpRequest?Tôi đã ấn tượng rằng WebSockets có ít chi phí hơn. –
Websockets có ít chi phí hơn cho truyền thông hai chiều, có, nhưng việc tải lên một tệp chỉ đơn giản là gửi một yêu cầu POST tới một máy chủ có tệp trong cơ thể. Trình duyệt là rất tốt ở đó và chi phí cho một tập tin lớn thực sự là gần không có gì. –
Tôi đã cân nhắc việc cắt nó thành từng mảnh nhỏ hơn. Tôi đoán tôi sẽ thử cắt nó bằng cách sử dụng API File và gửi nó bằng cách sử dụng XMLHttpRequest, xem cách nó đi. Cảm ơn sự giúp đỡ của bạn. Nếu bạn muốn trả lời với thông tin trên, và có thể là bất kỳ lời khuyên nào khác, tôi vui vẻ chấp nhận nó như là câu trả lời. –