我在使用Qt应用程序时遇到了一些麻烦;特别是QNetworkAccessManager类.我正在尝试使用QNetworkAccessManager的post()方法执行二进制文件的简单HTTP上载.文档声明我可以将指向qiodevice的指针发送到post(),并且该类将传输在qiodevice中找到的数据.这告诉我,我应该能够给post()一个指向QFile的指针.例如:
QFile compressedFile("temp");  
compressedFile.open(qiodevice::ReadOnly);  
netManager.post(qnetworkrequest(QUrl("http://mywebsite.com/upload") ),&compressedFile);

我正在开发的Windows系统上发生的事情是我的Qt应用程序从QFile推送数据,但是没有完成请求;它似乎坐在那里等待从文件中显示更多数据.在我手动终止应用程序之前,post请求不会“关闭”,此时整个文件显示在我的服务器端.

从一些调试和研究来看,我认为这种情况正在发生,因为当你到达文件末尾时,QFile的read()操作不会返回-1.我认为QNetworkAccessManager试图从qiodevice读取,直到它从read()获得-1,此时它假定没有更多数据并关闭请求.如果它继续从read()获得零返回码,QNetworkAccessManager假定可能有更多数据到来,因此它一直在等待该假设数据.

我已经用一些测试代码确认,在你读完文件末尾后,QFile的read()操作只返回零.这似乎与QNetworkAccessManager的post()方法期望qiodevice的行为方式不兼容.我的问题是:

>这是否与QFile在Windows下的工作方式有某种限制?
>我是否应该使用QFile或QNetworkAccessManager通过post()推送文件?
>这根本不起作用,我是否必须找到其他方式上传我的文件?

任何建议或提示将不胜感激.

更新:事实证明我有两个不同的问题:一个在客户端,一个在服务器端.在客户端,我必须确保我的QFile对象在网络事务期间保持不变. QNetworkAccessManager的post()方法立即返回,但实际上并未立即完成.您需要将一个槽附加到QNetworkAccessManager的finished()信号,以确定POST何时实际完成.在我的情况下,很容易将QFile保持在或多或少永久,但我还在finish()信号上附加了一个插槽,以便检查来自服务器的错误响应.

我将信号附加到插槽中,如下所示:

connect(&netManager,SIGNAL(finished(QNetworkReply*) ),this,SLOT(postFinished(QNetworkReply*) ) );

什么时候发送我的文件,我写了这样的邮政编码(请注意,compressFile是我的类的成员,因此在此代码之后不会超出范围):

compressedFile.open(qiodevice::ReadOnly);  
netManager.post(qnetworkrequest(QUrl(httpDestination.getCString() ) ),&compressedFile);

来自QNetworkAccessManager的完成(QNetworkReply *)信号触发我的postFinished(QNetworkReply *)方法.发生这种情况时,我可以安全地关闭compressedFile并删除co​​mpressedFile表示的数据文件.出于调试目的,我还添加了一些printf()语句来确认事务已完成:

void CL_QtLogCompressor::postFinished(QNetworkReply* reply)  
{  
    QByteArray response = reply->readAll();  
    printf("response: %s\n",response.data() );  
    printf("reply error %d\n",reply->error() );  
    reply->deleteLater();  
    compressedFile.close();  
    compressedFile.remove();  
}

由于compressedFile不会立即关闭并且不会超出范围,因此QNetworkAccessManager可以花费尽可能多的时间来传输我的文件.最终事务完成,我的postFinished()方法被调用.

我的另一个问题(这也导致我看到事务从未完成的行为)是我的Web服务器的Python代码没有正确地部署POST,但这超出了我原来的Qt问题的范围.

您正在堆栈上创建compressedFile,并将指针传递给您的qnetworkrequest(最终是您的QNetworkAccessManager).离开您所在的方法后,compressedFile就会超出范围.虽然行为未定义,但我很惊讶它并没有让你崩溃.

您需要在堆上创建QFile:

QFile *compressedFile = new QFile("temp");

您当然需要跟踪它,然后在帖子完成后将其删除,或者将其设置为QNetworkReply的子级,以便在以后销毁时将其销毁:

QFile *compressedFile = new QFile("temp"); 
compressedFile->open(qiodevice::ReadOnly);

QNetworkReply *reply = netManager.post(qnetworkrequest(QUrl("http://mywebsite.com/upload") ),compressedFile); 
compressedFile->setParent(reply);

windows – 使用QNetworkAccessManager的post()方法上传文件的更多相关文章

  1. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

  2. ios – 错误域= NSURLErrorDomain代码= -1003“找不到具有指定主机名的服务器

    当我尝试在设备上运行应用程序时出现此错误.当我在模拟器上运行它并且post请求正常工作时,我没有收到此错误.这是我的代码片段:任何帮助表示赞赏.谢谢解决方法此错误通常会提示DNS相关问题.检查设备上的DNS设置并确认您可以使用Safari或其他浏览器浏览互联网.如果有一个url,你可以在同一台服务器上获取,尝试直接在设备上的Safari中访问它.

  3. ios – Xcode Bot:如何在post触发器脚本上获得.ipa路径?

    我正在使用机器人来存档iOS应用程序,我需要获取.ipa产品路径才能将其发布到我们的分发系统中.机器人设置:并使用脚本打印所有env变量,其中不包含ipa文件的路径.此外,一些变量指向不存在的目录,即:XCS_OUTPUT_DIR这里的env变量输出:除此之外,我还能够确认.ipa文件是在另一个文件夹中创建的(/IntegrationAssets//

  4. ios – 使用CocoaPods post install hook将自定义路径添加到HEADER_SEARCH_PATHS

    解决方法在Podfile中定义一个方法:然后在post_install中调用该方法:

  5. iOS7 Safari中的全屏模式

    我正在使用SenchaTouch开发移动网站.在iOS7Safari中,我无法创建顶级地址栏和下面的工具栏消失了.Sencha过去常常处理iOS6,但iOS7最近的一些变化导致了这个问题.http://java.dzone.com/articles/safari-ios-7-and-html5我阅读了上面的链接&对于HTML5游戏而言,这似乎也是一个问题.一些其他应用程序.适用于iOS6的旧win

  6. ios – 如何使用新的Apple Swift语言发布JSON

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  7. ios – POST请求使用application / x-www-form-urlencoded

    后端开发人员在POST请求中给出了这些说明:>路线:{url}/{app_name/{controller}/{action}控制器和动作应该是小帽子.>API测试链接:http:****************>请求应该使用POST方法.>参数应通过请求内容体(FormUrlEncodedContent)传递.>参数应该是json格式.>参数是关键的.在协议中没有经验5,我搜索并结束了我的代码.

  8. 从iOS应用程序发送帖子到PHP脚本不工作…简单的解决方案就像

    我之前已经做了好几次了但是由于某些原因我无法通过这个帖子…我尝试了设置为_POST且没有的变量的PHP脚本……当它们未设置为发布时它工作精细.这是我的iOS代码:这里是PHP的一大块,POST变量不在正确的位置?我想这对于更有经验的开发人员来说是一个相当简单的答案,感谢您的帮助!解决方法$_POST是一个数组,而不是一个函数.您需要使用方括号来访问数组索引:

  9. ios – 在HTTPBody中设置NSDictionary并使用POST方法发送

    我想用POST方法调用Web服务.我需要发布一个带有URL的字典.我的Web服务参数如下:以下是我的要求:但是我收到以下错误:服务器拒绝此请求,因为请求实体的格式不受所请求方法所请求资源的支持解决方法请找到以下代码,将数据发布到Web服务.请注意这是我在我的一个申请中使用的样本.希望这可以帮助.从您的评论“服务器拒绝此请求”服务器是否支持JSON或XML格式.

  10. ios – 如何使用Firebase存储喜欢的内容

    我有一个关于firebase的后端,有像Facebook这样的帖子.所以我需要喜欢这些帖子的功能.问题是如何存储喜欢帖子的喜欢和用户?

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部