2012-12-20 2 views
5

원격 웹 서버에 이미지를 업로드하려고합니다. 나는 HTMLForm과 FilePartSource를 사용했다. 로컬 서버 (예 : loclhost)에 이미지를 성공적으로 업로드 할 수 있지만 원격 서버에 업로드하려고하면 원격 웹 서버에서받은 응답은 "411 Length Required"입니다. request.setContentLength (sizeofimagefile)를 설정하려고했지만 여전히 동일한 문제가 발생했습니다. 문제가 무엇인지 나에게 안내 할 사람이 있습니까? 내 코드는 다음과 같습니다. 사전POCO : C++에서 poco를 사용하여 웹 서버에 이미지를 업로드하는 방법

+0

in setContentLength (sizeofimagefile), 요청 데이터 블록에 이미지와 함께 보내는 매개 변수 "aaaaaa"및 "cccccc"의 크기를 포함 시켰습니까? 폼에 POST 메서드를 사용하면 이러한 매개 변수는 업로드하려는 이미지와 동일한 데이터 블록으로 이동합니다. –

답변

0

에서

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(); 

감사 로컬 서버에 파일을 업로드 할 수 있지만 원격 아파치/PHP는 업로드 제한이있는 경우 원격 서버로 먼저 확인해야 할 수 없습니다. 원격 서버에서 phpinfo()를 시도하십시오. 그렇지 않다면, 당신은 당신의 코드를 수정해야

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

...

마시고 문서에서, URL에서

: http://www.appinf.com/docs/poco/Poco.Net.HTMLForm.html

HTMLForm :

HTMLForm (CONST HTTPRequest & 요청, 표준 : istream & requestBody);

주어진 HTTP 요청에서 HTMLForm을 작성합니다. 업로드 된 파일은 입니다. 자동으로 삭제됩니다. ]

HTMLForm (CONST의 HTTPRequest & 요청 표준 : IStream을 & requestBody, PartHandler & 핸들러)

HTMLForm :

그리고이 생성자

주어진 HTTP 요청에서 HTMLForm을 작성합니다. 업로드 된 파일은 주어진 PartHandler으로 전달됩니다.

예를 들어, 어떤 생성자를 적용하고 있습니까? 한편

,

addPart :

무효 addPart ( const를 표준 : : 문자열 & 이름, PartSource *의 PSource); 양식에 첨부 파일 (파일 업로드)을 추가합니다. 이 양식은 PartSource의 소유권을 가져오고 더 이상 필요하지 않을 때 을 삭제합니다.부분은 폼의 부호화 집합을 "multipart/form-data"addPart 및 HTMLForm위한 제 생성자 "다중/폼 데이터"를 사용

시도 경우 전송한다.

작동하지 않는 경우 Wireshark와 같은 네트워크 스니퍼를 사용하여 보내는 것을 확인하십시오.

요청의 Content-Length 헤더가 sizeof (이미지) + sizeof ("aaaaaa"및 "cccccc"매개 변수)인지 확인하십시오. POST 대신 GET 메서드로 양식을 보내보십시오.

작동하는지 알려주세요.

감사

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

코드는 요청 개체로 양식 데이터를 할당 할 수 없습니다. 따라서 session.sendRequest를 호출하면 빈 요청이 서버로 전송됩니다. HTMLForm을 HTTPRequest로 올바르게 변환하려면 다음과 같이 작성해야합니다. -

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

나를 위해 노력하고 있습니다 이미지 업로드 코드는 -

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); 

대응 업로드 서버가 HTML 양식 파일을 업로드 표준 PHP 코드를 사용하고 있습니다.