2014-01-13 39 views
0

我正在编写一个程序,该程序将有一个用户列表,并且每个用户都将拥有来自在线源的自己的图片。 我正在成功下载数据,我正在努力格式化图片格式。 成功保存文件,但不会以可读格式保存。将图片从在线存储到本地存储qt 5.1

void FriendsListProcess::picRequesFinished(QNetworkReply *reply) 
{ 
    QByteArray data = reply->readAll(); 
    if(reply->error()) 
    { 
     qDebug() << reply->errorString(); 
     return; 
    } 
    emit savePic(pic_name_path,data); 
    reply->deleteLater(); 
} 

void FriendsListProcess::savePicToFile(QString file, QByteArray &pic_data) 
{ 
qDebug() << "File name from write pic: " << file; 
QFile f(file); 
if(f.open(QIODevice::WriteOnly)) 
{ 
    QDataStream out(&f); 
    out << pic_data; 
     f.close(); 
} 
} 

当我尝试打开保存文件窗口说

"Windows Photo Viewer can't open this picture because either Photo Viewer doesn't support this file format. or you don't have the lates updates to Photo Viewer" 

有你们有什么建议吗?

+0

它是在远程主机上的正确的图像,即它与您的浏览器或wget的,等下载后工作? OT:您的保存方法缺少打开和写入的错误检查。 – lpapp

+0

是的,我可以点击链接打印到我的调试控制台,它下载没有任何问题与任何大师 – TheMan68

+0

为什么你不使用QDataStream这样的二进制数据?图像不是文本流。顺便说一句,如果图像很大,没有通过块读取,你的代码浪费了大量的内存。写入操作是否成功?请检查。 – lpapp

回答

1

你在你的代码中的以下问题:

  • 你写的图像数据,如果它是一个文本流,而这是一个二进制流。

  • 您阅读所有内容时没有通过大块阅读。这可能会浪费更多的内存。

  • 您缺少代码中的错误检查。

  • 你不必要的在这里有信号/插槽间接。

  • 在完成的处理程序插槽中检查QNetworkReply错误是多余的,因为这样的事情会更好地在错误信号处理程序插槽中捕获。

  • 你打开文件为ReadOnly,而你想写的是吧。

  • 用文本打开模式标志打开文件,而图像是二进制数据。

我会写这样的事:

void FriendsListProcess::picRequesFinished(QNetworkReply *reply) 
{ 
    QFile file(pic_name_path); 
    if (!file.open(QIODevice::WriteOnly)) { 
     qDebug() << "Failed to open the file for reading:" << file.fileName(); 
     return; 
    } 

    // You would need to make sure you do not get irrelevant data in the meantime 
    while (reply->bytesAvailable()) { 
     if (file.write(reply->read(512)) == -1) 
      qDebug() << "Error while reading data:" << file.errorString(); 
    } 
} 
+0

我真的很抱歉。与qt我真的是一个业余的时候处理文件和许多方面。所以请你问我如何循环上面的代码? – TheMan68

+0

它已被写入... – lpapp

+0

哦对不起。我没有重新加载页面 – TheMan68

相关问题