qt http 上传文件

//Qt文件
QFile file( "1.jpg" );
if (!file.open (QIODevice::ReadOnly)){
     qDebug()<< "file open failed." ;
     return ;
}
QByteArray data=file.readAll ();
file.close ();
QNetworkRequest req(QUrl( "http://localhost:88/index.php" ));
networkMgr->post (req, "fileData=" +data.toBase64 ()+ "" );


看服务器支持,如果是http服务器,可用 http post方式上传数据或文件。


二、客户端

      客户端比服务器稍微麻烦一些,QT 工程如何建立,这里就不描述了,大致步骤如下:

      1)新建一个类  Upload,并定义几个成员:

           QNetworkAccessManager    *_uploadManager;
           QNetworkReply            *_reply;

           char*   m_buf;

      2)定义事件槽

           void replyFinished( QNetworkReply* );  

           void upLoadError(QNetworkReply::NetworkError errorCode);
           void OnUploadProgress( qint64 bytesSent, qint64 bytesTotal );

      3)在构造函数中,加入以下代码:

            _uploadManager = new QNetworkAccessManager(this);
          connect(_uploadManager,SIGNAL(finished(QNetworkReply*)),SLOT(replyFinished(QNetworkReply*)));

          m_buf = NULL;   //析构函数中,if( m_buf != NULL ) delete[] m_buf;
 

      4) 准备传送文件,为了简单,关于异常处理代码都忽略了
          QFile file( “文件全路径名" );
          file.open(QIODevice::ReadOnly) )
          int  file_length = file.size();
        

          QDataStream in(&file);
          m_buf = new char[file_len];
          in.readRawData( m_buf, file_len);
          file.close();

           //准备头信息
          QNetworkRequest request( url );

           //这句很重要,不然传二进制文件,服务器会说安全问题
          request.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream");
          request.setRawHeader("filename", filename.toUtf8() );
          //准备数据
          QByteArray arr = QByteArray( m_buf, file_len );
          _reply = _uploadManager->post( request , arr );
          connect(_reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(upLoadError(QNetworkReply::NetworkError)));
          connect(_reply, SIGNAL(uploadProgress ( qint64 ,qint64 )), this, SLOT( OnUploadProgress(qint64 ,qint64 )));
  

      5)在相应的事件中加入自己需要的代码

            replyFinished  事件中提示用户上传完毕

            upLoadError   事件中提示遇到传输错误

            OnUploadProgress  事件中更新进度条提示

 

三、备注

       1)如果需要传送大文件,就不要一次读入所有数据,可以每次读取 10K,然后传送,传完后继续读取下 10K,如果遇到传输错误,可以重传刚才的 10K;

       2)文中没有提到断点续传,其实这种方式断点续传是很容易的,每次传输后,都记录好已经传输的偏移量,下次从这里传输就好了,还可以把偏移量信息通过 HTTP 头发送给服务器,让服务器知道;

       3)如果你不想用 QT,可以考虑用系统提供的 API 完成。


你可能感兴趣的:(qt)