2014-08-27 16 views
6

Tôi sử dụng https://github.com/nervgh/angular-file-upload để tải tệp lên.Tải lên tệp AngularJS gửi biểu mẫu cũData

Tôi có biểu mẫu, ngoài việc tải lên tệp, gửi một số trường khác. Để làm rõ, tôi chỉ gửi một lĩnh vực trong ví dụ này:

$scope.save_with_upload = function(user) { 
    $scope.uploader.formData = [{ 
     name: user.name, 
    }]; 

    $scope.uploader.uploadAll(); 
} 

Hãy nói rằng giá trị của name đầu vào là Test 1.

  1. Khi tôi lần đầu tiên tải trang và nhấp Lưu, nó sẽ gửi các tập tin nhưng không gửi formData ở tất cả.
  2. Sau đó, tôi thay đổi trường name thành Kiểm tra 2 và nhấn Lưu. Nó sẽ gửi tệp và formData, nhưng giá trị của name nó sẽ gửi là Kiểm tra 1.
  3. Sau đó, tôi thay đổi trường name thành Kiểm tra 3 và nhấn Lưu. Nó sẽ gửi tệp và formData, nhưng giá trị của name nó sẽ gửi là Kiểm tra 2.
  4. ... và vân vân ...

Vì vậy, nó dường như luôn luôn gửi dữ liệu đã được gán cho formDatatrước cuộc gọi cuối cùng để uploadAll.

Để làm rõ: Nếu tôi làm dir(user, $scope.uploader.formData) ngay trước khi gọi uploadAll, nó sẽ hiển thị các giá trị cập nhật chính xác trong cả hai.

Tôi đã vật lộn với nó trong một vài giờ và dường như không thể thấy có gì sai. Ý tưởng nào?

Trả lời

12

Gắn trường biểu mẫu để các đối tượng FileItem - chứ không phải là để FileUpload - sửa chữa nó:

uploader.onBeforeUploadItem = function(item) { 
    formData = [{ 
     name: user.name, 
    }]; 
    Array.prototype.push.apply(item.formData, formData); 
}; 

Lý do là, trên thực tế các thiết lập trên FileItem được sử dụng. Khi tệp được thêm vào hàng đợi, cài đặt từ FileUpload được sao chép sang FileItem. Vì vậy, bất kỳ thay đổi nào đối với các tùy chọn FileUpload được thực hiện sau khi một tệp đã được thêm vào hàng đợi sẽ không có hiệu lực.

+0

cuộc gọi lại này được thực hiện ở đâu? Tôi đã thử nó trong bộ điều khiển và nó không chạy. Bạn có thể chỉ ném nó trong tầm nhìn không? – bischoffingston

+1

Ngoài ra tại sao bạn không thể 'item.formData.push (formData)'? – bischoffingston

+1

@bischoffingston Mã này cần phải đi vào bộ điều khiển. 'uploader' phải là một thể hiện của' FileUpload'. 'item.formData.push (formData)' và 'Array.prototype.push.apply (item.formData, formData)' là tương đương. –

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