2017-06-01 22 views
10

Tôi có javascript sau đây sản xuất hình ảnh từ canvas và tải chúng lên máy chủ.Điều gì sẽ khiến Canvas canvas toBlob tạo hình ảnh không đầy đủ?

var can = document.createElement('canvas'); 
can.width = 600; 
can.height = 600; 
var ctx = can.getContext('2d'); 
ctx.fillRect(0, 0, can.width, can.height); 
ctx.fillText("Julia", can.width/2, can.height/2); 
can.toBlob(uploadImage, "image/jpg", 0.9); 

function uploadImage(jpeg) { 
    var data = new FormData(); 
    data.append('image', jpeg, 'image.jpg'); 
    ... 
} 

enter image description here

Mỗi thường như vậy, kết quả trông giống như trên, chỉ một phần rút ra. Nhiều khung hình được xử lý và tải lên một cách thẳng thắn, chỉ di chuyển khi hoàn thành phần ajax (trong phần ...), do đó chỉ có một khung hình.

Bạn đã thấy điều này xảy ra chưa? Nếu vậy, ở đâu trong quá trình này tôi nên gỡ lỗi thêm? Có lẽ một thiết lập hoặc một cái gì đó trong đối tượng bối cảnh?

Sửa

Việc tải là một bài ajax với một lời hứa giải quyết chỉ trên chi nhánh thành công. Nó thực sự sử dụng dịch vụ $ http của angular:

$http({method: 'POST', url: '...', data: data}).then(function(response) { 
    // callback that processes and uploads the next image 
}); 
+2

Đối với tôi nó trông giống như tải hình ảnh đã bị gián đoạn và bạn chỉ có một phần của hình ảnh. Tôi chưa bao giờ thấy toBlob hoặc toDataURL làm điều đó với một hình ảnh, nhưng tôi đã thấy nhiều jpeg không hoàn chỉnh trông giống như khi xuống và tải lên do lỗi kết nối – Blindman67

+0

Bạn có thể hiển thị mã tải lên không? – adam0101

+1

Vì vậy, nó có thể cho javascript để xem đường dẫn thành công nếu máy chủ không đọc toàn bộ yêu cầu? ... Tôi nghĩ rằng không, nhưng có lẽ đây là một câu hỏi góc. Có lẽ một vấn đề đệm đơn giản trên máy chủ ... có lẽ tôi có thể vượt qua kích thước blob như một tham số biểu mẫu khác và kiểm tra nó với kích thước tệp đã nhận trên máy chủ. –

Trả lời

2

Chúng tôi đang đối mặt với ngoại trừ một phần với canvas. Bạn có thể gỡ lỗi đơn giản.

  1. In các đốm màu cho trang dưới dạng img src để đảm bảo tệp được tạo đúng cách. In cũng có kích thước blob.
  2. Mở các công cụ dành cho nhà phát triển của trình duyệt -> Mạng -> Lọc XHR và bắt đầu tải lên
  3. Gán yêu cầu ajax hoàn thành (trạng thái 200) và xem Tiêu đề yêu cầu -> Nội dung dài. Nếu số này bằng với kích thước blob trên trang, nó đã được tải lên đúng cách và tìm sự cố ở phía máy chủ. Khác kiểm tra cuộc gọi ajax.
  4. Đảm bảo rằng máy chủ đã đặt kích thước yêu cầu ứng dụng khách tối đa phù hợp với hệ thống của bạn. Ví dụ nginx có giá trị mặc định là 1 triệu.

TIP: đặt Loại nội dung theo blob.type trong tiêu đề $ http. Giá trị mặc định cho POST là application/json.

+1

Hoặc thậm chí tốt hơn, không làm thông qua devtools, nhưng để cho máy chủ đáp ứng với kích thước của tệp được tải lên và so sánh trên máy khách để kiểm tra xem nó có tốt hay không. – Bergi

+0

Sự cố bạn gặp phải là gì? Khách hàng có gửi hình ảnh hoặc máy chủ không nhận được hình ảnh đó không? –

+0

Yea. Chúng tôi đã làm. Nhưng tôi đã sử dụng https://github.com/danialfarid/ng-file-upload. Nó cung cấp một số tính năng hữu ích cho các tập tin media như thay đổi kích cỡ, tiến độ và vv .. Chúng tôi cũng làm việc với các tập tin video lớn được chia nhỏ thành 10 triệu phần, vì vậy lần đầu tiên nó được yêu cầu của nginx max_request_body_size. Sau đó, một lỗi trong logic của người đọc phụ trợ (python). Nhưng chúng tôi cũng đã triển khai những thứ như tạm dừng và tiếp tục, do đó, đó là một trường hợp khác. Các bước gỡ lỗi ở trên phải là chung cho tất cả các loại vấn đề này + ghi nhật ký ở cả hai bên luôn hiển thị những gì sai. – bigless

0

cố gắng để sắp xếp lại logic của bạn một chút ,, bạn đang nhận được tình trạng đua với quá trình tải lên và khi hình ảnh được tạo ra, họ phải được gọi lại trong callback sorta ..

// ... 
ctx.fillText("Julia", can.width/2, can.height/2); 
can.toBlob(function(blob) { 
    var newImg = document.createElement('img'), 
     url = URL.createObjectURL(blob); 
    newImg.onload = function() { 
     // no longer need to read the blob so it's revoked 
     URL.revokeObjectURL(url); 
     newImg.src = url; 
     // we have image out of canvas and now do the upload of newImg 
     // $http || $.ajax call goes here 
    }; 
}); 

của nếu bạn muốn gửi URL của dữ liệu hình ảnh thử một cái gì đó giống như ,,

// ... 
ctx.fillText("Julia", can.width/2, can.height/2); 
can.toBlob(function(blob) { 
    var reader = new window.FileReader(); 
    reader.readAsDataURL(blob); 
    reader.onloadend = function() { 
       base64data = reader.result; 
     // we have image in base64 and now do the upload of base64data 
     // $http || $.ajax call goes here 
    } 
}); 

h, k

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