2016-06-18 17 views
5

Tôi có ứng dụng React của mình đăng một tệp với lệnh tìm nạp api đến điểm cuối '/ dataset'.Máy chủ Flask không thể đọc tệp được tải lên theo yêu cầu POST

import 'whatwg-fetch'; 

uploadData(csv) { 
    this.dataset = csv; 

    fetch('/dataset', { 
     method: 'POST', 
     body: this._fileToFormData(csv) 
    }).then(
     (response) => { 
      console.log(response); 
     } 
    ).catch(() => {}); 
}; 

_fileToFormData(file) { 
     var formData = new FormData(); 
     formData.append('file', file); 
     return formData 
    }; 

Máy chủ Flask của tôi được cho là sẽ nhặt nó lên.

@app.route('/dataset', methods=['POST']) 
def dataset(): 
    print request.get_data() 
    csv_data = request.form['file'] 
    print csv_data 
    return '{ "fake_json":100}', 200 

Tuy nhiên, đối tượng csv_data chỉ đơn giản là một chuỗi unicode, '[object File]'

print "form:", request.form 
print "files:", request.files 

lợi nhuận

ImmutableMultiDict([('file', u'[object File]')]) 
ImmutableMultiDict([]) 

Làm thế nào để tôi nhận được các nội dung thực tế của CSV tập tin?

=== CHỈNH SỬA: Đã giải quyết ===

biến csv thực ra là một mảng tệp duy nhất, vì vậy tôi cần trích xuất tệp.

+0

bạn đã thử tệp.read() thay vì trả về đối tượng tệp từ biểu mẫu chưa? tôi nghĩ rằng nó sẽ giống như, csv_data.read()? – glls

+0

Vâng, tôi gặp lỗi khi nói rằng đối tượng unicode không có phương thức .read:/ – jldork

+0

'csv' là gì khi bạn gọi đó là' uploadDoc'? Bạn có chắc đó là thứ mà 'FormData' hiểu là đầu vào của tệp không? – davidism

Trả lời

1

Tệp đã tải lên có sẵn trong request.files, không phải request.form. Các giá trị là các đối tượng giống như tệp, do đó, để lấy dữ liệu bạn cần đọc tệp.

data = request.files['file'].read() 

Xem Flask docs để biết một số ví dụ về cách làm việc với video tải lên.


Bạn cũng cần tải lên tệp chính xác. GitHub's fetch polyfill có ví dụ sử dụng FormData để định dạng cơ thể đúng cách. Bạn phải chuyển một tệp hoặc đầu vào cho từng cuộc gọi đến append.

var input = document.querySelector('input[type="file"]') 
var data = new FormData() 
data.append('file', input.files[0]) 

fetch('/dataset', { 
    method: 'POST', 
    body: data 
}) 
+0

request.files trống cho tôi? – jldork

+0

Tôi hiểu, đó là từ thư viện https://github.com/github/fetch Quick q: thông thường, khi bạn thêm một đối tượng tệp vào FormData() và POST nó, bạn sẽ thấy nó trong request.files? – jldork

+0

Thực ra đó là ví dụ tôi đang theo dõi! Tôi chỉ gói tạo FormData trong hàm _fileToFormData() của mình – jldork

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