2012-03-04 35 views
6

Tôi có câu hỏi nhanh về tải lên tệp POST trong ActionScript 3. Tôi đang cố gắng tải lên ByteArray từ bộ nhớ qua POST tới máy chủ. Tôi đang sử dụng lớp URLRequest để gửi dữ liệu và URLLoader vì tôi muốn theo dõi tiến độ. Các bộ phận liên quan của mã sau:Tải lên tệp POST bằng URLRequest

var uploadRequest:URLRequest = new URLRequest("http://127.0.0.1/upload.php"); 
uploadRequest.method = URLRequestMethod.POST; 
uploadRequest.contentType = "multipart/form-data"; 
uploadRequest.data = myByteArray; 

var uploader:URLLoader = new URLLoader; 
uploader.addEventListener(ProgressEvent.PROGRESS, onUploadProgress); 
uploader.addEventListener(Event.COMPLETE, onUploadComplete); 
uploader.dataFormat = URLLoaderDataFormat.BINARY; 
uploader.load(uploadRequest); 

Vấn đề là tôi đã thiết callbacks của tôi để theo dõi tiến độ tải lên, và tài sản của BYTESTOTAL ProgressEvent luôn là 1960 (kích thước của dữ liệu yêu cầu trừ?) , mặc dù dữ liệu thực tế là khoảng 20MB và không có tệp nào được tải lên ngay cả sau khi sự kiện hoàn thành kích hoạt.

Tôi đã xác minh rằng các hàm upload.php đúng với biểu mẫu html đơn giản và tôi có thể xác minh rằng myByteArray chứa tất cả dữ liệu được đề cập. Bất cứ ai có thể cho tôi biết những gì tôi đang làm sai?

Edit:

Tôi đã cố gắng một vài điều mới mà tôi nghĩ tôi nên đề cập đến. Đầu tiên là thiết lập kiểu nội dung thành application/octet-stream thay vì multipart/form-data, không có tác dụng nào khác ngoài tăng số byte thành 1964. Tôi cũng kiểm tra nhật ký lỗi Apache và tìm thấy đoạn văn bản sau lặp đi lặp lại rất nhiều :

PHP Warning: Missing boundary in multipart/form-data POST data in Unknown on line 0

Tôi đoán Flash không định dạng đúng yêu cầu HTTP vì bất kỳ lý do gì. Cho rằng tôi đã tạo một FileReference sử dụng các phương thức tương tự như tôi đã đặt cho URLLoader để tải tệp lên từ đĩa và nhận kết quả mong đợi: thuộc tính bytesTotal khớp với kích thước tệp và tệp được tải lên chính xác.

Làm việc từ mà tôi tìm thấy một trang trong phát triển tài liệu Adobe rằng đề cập đến việc tải dữ liệu đến một máy chủ sử dụng FileReference.upload() bằng cách thiết lập các thông số dữ liệu của URLRequest, vì vậy tôi cố gắng đoạn mã sau:

var uploadRequest:URLRequest = new URLRequest("http://127.0.0.1/upload.php"); 
uploadRequest.method = URLRequestMethod.POST; 
uploadRequest.data = myByteArray; 

fileRef = new FileReference; 
fileRef.addEventListener(ProgressEvent.PROGRESS, onUploadProgress); 
fileRef.addEventListener(Event.COMPLETE, onUploadComplete); 
fileRef.upload(uploadRequest); 

nào dẫn đến kết quả như sau:

ArgumentError: Error #2127: FileReference POST data cannot be type ByteArray.

tôi thực sự bị mắc kẹt ở đây. Mọi lơi đê nghị đêu nên được đanh gia cao!

+0

Bạn thử - uploadRequest.contentType = "application/octet-stream"; – Neil

+0

Kết quả tương tự, khác biệt duy nhất là byteTotal là 1964 (bốn ký tự phụ). Cảm ơn bạn đã đề xuất mặc dù! –

+0

Cập nhật nhanh cho bất kỳ ai quan tâm. Tôi đã kiểm tra nhật ký lỗi Apache và mọi nỗ lực để tải lên các kết quả tệp trong dòng này: "Cảnh báo PHP: Thiếu ranh giới trong dữ liệu POST nhiều biểu mẫu/dữ liệu trong Không xác định trên dòng 0" –

Trả lời

8

Bạn nên thêm biết thêm vào "Content-Type" tiêu đề:

uploadRequest.contentType = "multipart/form-data; boundary=<<boundary here>>"; 

Kiểm tra ví dụ ở đây: http://marstonstudio.com/?p=36

+0

Đã hoạt động! Cảm ơn bạn rất nhiều! Tôi giả định rằng Flash sẽ thêm các ranh giới cho tôi. Không có gì lạ khi nó không hoạt động. –

+0

Rất vui khi được nghe. :) – deadrunk

+3

Liên kết bị hỏng – Soid

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