2012-12-20 33 views
5

Tôi đang cố gắng tải hình ảnh lên máy chủ web từ xa. Tôi đã sử dụng HTMLForm và FilePartSource. Tôi có thể tải ảnh thành công lên máy chủ cục bộ (ví dụ: loclhost) nhưng khi tôi thử tải lên máy chủ từ xa, phản hồi nhận được từ máy chủ web từ xa là "411 Độ dài bắt buộc". Tôi đã cố gắng đặt request.setContentLength (sizeofimagefile) nhưng vẫn là vấn đề tương tự. Có ai có thể hướng dẫn tôi về vấn đề này hay không. Đây là mã của tôi.POCO: Cách tải hình ảnh lên webser bằng poco trong C++

HTMLForm htmlform; 
htmlform.set("aaaaaa", "bbbbbbb"); 
htmlform.set("cccccc", "ddddddd"); 
htmlform.setEncoding(HTMLForm::ENCODING_MULTIPART); 

PartSource * pFileSrc = new FilePartSource("filename", "application/octet-stream"); 

std::istream& mystream = pFileSrc->stream(); 
mystream.seekg(0, std::ios::end); 
int uiLength = mystream.tellg(); 

    htmlform.addPart("file", pFileSrc); 

URI uri("yyy"); 

    HTTPClientSession session(uri.getHost(), uri.getPort());   
HTTPRequest post_req(Poco::Net::HTTPRequest::HTTP_POST,"xxx",HTTPMessage::HTTP_1_1);   
post_req.setKeepAlive(true); 
htmlform.prepareSubmit(post_req); 


std::ostream& oustr = session.sendRequest(post_req); 
htmlform.write(oustr); 

HTTPResponse res; 
std::istream& rs = session.receiveResponse(res); 

std::cerr << rs.rdbuf(); 

Cảm ơn trước

+0

trong setContentLength (sizeofimagefile), Bạn có bao gồm kích thước tham số "aaaaaa" và "cccccc" mà bạn gửi cùng với hình ảnh của mình trong DataBlock yêu cầu không? Nếu bạn sử dụng phương thức POST cho biểu mẫu của mình, các thông số này sẽ chuyển đến cùng một khóa dữ liệu mà hình ảnh bạn đang cố gắng tải lên. –

Trả lời

0

Nếu bạn có thể tải lên một tập tin đến máy chủ địa phương của bạn, nhưng có thể không phải với máy chủ từ xa của bạn, trước tiên bạn nên kiểm tra xem Apache từ xa/PHP có một giới hạn tải lên. Hãy thử một phpinfo() trong máy chủ từ xa của bạn.

http://www.cyberciti.biz/faq/linux-unix-apache-increase-php-upload-limit/

Nếu không, bạn nên xem xét lại mã của bạn ...

Từ tài liệu Poco, tại URL: http://www.appinf.com/docs/poco/Poco.Net.HTMLForm.html

HTMLForm:

HTMLForm (const Yêu cầu HTTPRequest &, std :: istream & requestBody);

Tạo HTMLForm từ yêu cầu HTTP đã cho. Tệp đã tải lên là bị loại bỏ âm thầm.

Và với constructor này:

HTMLForm:

HTMLForm (const HttpRequest & yêu cầu, std :: istream & requestBody, PartHandler & handler);

Tạo HTMLForm từ yêu cầu HTTP đã cho. Các tệp đã tải lên được chuyển đến PartHandler nhất định.

Trong ví dụ của bạn, Bạn đang áp dụng hàm tạo nào?

Mặt khác,

addPart:

trống addPart ( const std :: string & tên, PartSource * pSource); Thêm một phần/tệp đính kèm (tệp tải lên) vào biểu mẫu. Biểu mẫu có quyền sở hữu của PartSource và xóa nó khi không còn cần thiết nữa.Phần sẽ chỉ được gửi nếu mã hóa thiết lập cho các hình thức là "multipart/form-data"

Cố gắng sử dụng "multipart/form-data" với addPart và các nhà xây dựng thứ hai cho HTMLForm.

Nếu không hoạt động, hãy thử sử dụng trình ẩn mạng như Wireshark để kiểm tra xem bạn đang gửi gì.

Kiểm tra xem tiêu đề Content-Length của Yêu cầu của bạn có kích thước sizeof (hình ảnh của bạn) + sizeof ("aaaaaa" và "cccccc"). Hoặc cố gắng gửi biểu mẫu của bạn bằng phương thức GET thay vì POST.

Hãy cho tôi biết nếu nó hoạt động.

Trân

4
std::ostream& oustr = session.sendRequest(post_req); 
htmlform.write(oustr); 

Mã của bạn không có khả năng gán dữ liệu mẫu vào đối tượng yêu cầu. Vì vậy, khi bạn gọi session.sendRequest, một yêu cầu trống sẽ được gửi đến máy chủ. Để thực hiện chuyển đổi HTMLForm đúng sang HTTPRequest, bạn phải viết như thế này -

htmlform.write (session.sendRequest (post_req));

Mã upload hình ảnh đó đang làm việc đối với tôi là -

HTTPRequest request(HTTPRequest::HTTP_POST, "/fileupload/upload_file.php", HTTPMessage::HTTP_1_1); 
    HTMLForm form; 
    form.setEncoding(HTMLForm::ENCODING_MULTIPART); 
    form.set("entry1", "value1"); 
    form.set("entry2", "value2"); 
    form.addPart("file", new FilePartSource("/home/abc/Pictures/sample.png")); 
    form.prepareSubmit(request); 

    HTTPClientSession *httpSession = new HTTPClientSession("localhost"); 
    httpSession->setTimeout(Poco::Timespan(20, 0)); 
    form.write(httpSession->sendRequest(request));   

    Poco::Net::HTTPResponse res; 
    std::istream &is = httpSession->receiveResponse(res); 
    Poco::StreamCopier::copyStream(is, std::cout); 

Máy chủ tải lên tương ứng được sử dụng mã PHP tiêu chuẩn để tải file dưới dạng HTML.