没有得到 QNetworkAccessManager post 方法的任何回复

Posted

技术标签:

【中文标题】没有得到 QNetworkAccessManager post 方法的任何回复【英文标题】:Not getting any reply of QNetworkAccessManager post method 【发布时间】:2013-07-02 05:06:46 【问题描述】:

我使用 QNetworkAccessManager 将少量二进制数据发送到 php Url。 php页面接收到数据后,进一步处理后将一些数据作为强制下载发回。我可以看到成功发布到服务器,但之后我在 QNetworkReply 中没有得到正确的响应,我看不到它发出任何信号。

//mUploadData is QByteArray

mUploadData.append(QString("--" + mBoundary + "\r\n").toAscii());
mUploadData += "Content-Disposition: form-data; name=\"UserData\";    

filename=\"UserData.trprof\"\r\n";
mUploadData += "Content-Type: application/octet-stream\r\n\r\n";    
mUploadData += encryptedPostData;
mUploadData += "\r\n";
mUploadData += QString("--" + mBoundary + "\r\n").toAscii();
mUploadData += "Content-Disposition: form-data; name=\"upload\"\r\n\r\n";
mUploadData += "Uploader\r\n";
mUploadData += QString("--" + mBoundary + "--\r\n").toAscii();

QUrl serviceUrl = QUrl( "http://localhost/user_data/listen_post.php" );

QNetworkRequest request(serviceUrl);

request.setRawHeader("Content-Type","multipart/form-data; boundary=---------------------------193971182219750");

// post data to the server.
mNetworkReply = mNetworkAccessManager.post( request , mUploadData );

mDownloadedBytes.clear();


connect( mNetworkReply , SIGNAL( finished() ) , this , SLOT( httpFinished() ) );
connect( mNetworkReply , SIGNAL( readyRead() ) ,  this , SLOT( httpReadyRead() ) );
connect( mNetworkReply , SIGNAL( error( QNetworkReply::NetworkError ) ) ,  this , SLOT( printError(  QNetworkReply::NetworkError ) ) );

这里是php代码:

<?php
$file = 'test.txt';
$post_info = file_get_contents($_FILES['UserData']['tmp_name']);

file_put_contents( $file , $decrypted );

$filename = 'test2.txt';

if (file_exists($filename)) 

    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($filename));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($filename));
    ob_clean();
    flush();
    file_put_contents( $file , filesize($filename) , FILE_APPEND );
    readfile($filename);

    exit;


?>

请注意,我已经使用 QNetworkAccessManager get 方法测试了 php 下载代码,并在浏览器中简单地打开了页面,在这两种情况下我都得到了正确的下载,但只有在 Qt 发布的情况下我什么都没有。没有发出信号,所以我什至无法判断是否发生了错误,我简直一无所知,这是怎么回事。

任何帮助将不胜感激。

问候 阿文德拉辛格

【问题讨论】:

【参考方案1】:

我不确定为什么您没有收到错误回复。有一个多部分数据的包装器,如果问题出在格式上,它可能会有所帮助。 https://qt-project.org/doc/qt-4.8/qhttpmultipart.html

您是否检查过 PHP 日志或使用 Wireshark/tcpdump 来查看请求的格式是否正确?

【讨论】:

【参考方案2】:

感谢 nickrak 的快速回复。我解决了这个问题。由于对象的范围,我似乎面临没有信号的问题,我从中将数据发布到服务器。一旦我将其设置为 non-local ,我就开始正确接收信号。

【讨论】:

以上是关于没有得到 QNetworkAccessManager post 方法的任何回复的主要内容,如果未能解决你的问题,请参考以下文章

为啥我没有得到授权标头?

没有从服务器得到任何响应,但能够从 telnet 得到响应

没有得到任何输出或错误ghostscript python

在颤动中没有得到正确的 api 响应

为啥我没有得到任何回应

笔尖但没有得到 UITableView