8

イメージをリモート Web サーバーにアップロードしようとしています。HTMLForm と FilePartSource を使用しました。イメージをローカル サーバー (つまり、loclhost) に正常にアップロードできますが、リモート サーバーにアップロードしようとすると、リモート Web サーバーから受信した応答は "411 Length Required" です。request.setContentLength(sizeofimagefile) を設定しようとしましたが、それでも同じ問題です。何が問題なのか、誰でも私を案内してもらえますか。これが私のコードです。

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

前もって感謝します

4

2 に答える 2

5
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 コードを使用しています。

于 2014-02-06T11:43:09.317 に答える
0

ローカル サーバーにはファイルをアップロードできるが、リモート サーバーにはアップロードできない場合は、まず、リモート Apache/PHP にアップロード制限があるかどうかを確認する必要があります。リモートサーバーで phpinfo() を試してください。

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

そうでない場合は、コードを修正する必要があります...

Poco ドキュメントの URL: http://www.appinf.com/docs/poco/Poco.Net.HTMLForm.html

HTMLフォーム:

HTMLForm( const HTTPRequest & request, std::istream & requestBody);

指定された HTTP リクエストから HTMLForm を作成します。アップロードされたファイルは黙って破棄されます。

そして、このコンストラクタで:

HTMLフォーム:

HTMLForm( const HTTPRequest & request, std::istream & requestBody, PartHandler & handler);

指定された HTTP リクエストから HTMLForm を作成します。アップロードされたファイルは、指定された PartHandler に渡されます

あなたの例では、どのコンストラクターを適用していますか?

一方で、

addPart:

void addPart( const std::string & name, PartSource * pSource ); 部品/添付ファイル (ファイルのアップロード) をフォームに追加します。フォームは PartSource の所有権を取得し、不要になると削除します。フォームに設定されたエンコーディングが「multipart/form-data」である場合にのみ、パートが送信されます

addPart と HTMLForm の 2 番目のコンストラクターで "multipart/form-data" を使用してみてください。

うまくいかない場合は、Wireshark などのネットワーク スニファーを使用して、何を送信しているかを確認してください。

リクエストの Content-Length ヘッダーに sizeof(your image) + sizeof("aaaaaa" and "cccccc" params) があるかどうかを確認します。または、POST ではなく GET メソッドを使用してフォームを送信してみてください。

うまくいくかどうか教えてください。

よろしく

于 2013-01-16T09:03:26.467 に答える