2010-04-21 156 views
7

在Qt中,我需要發送一個sqlite文件(二進制文件)到一個網站使用後。所以我所做的是打開文件並嘗試將它的內容讀入QByteArray,我可以藉助QNetworkRequest發送給服務器。我可以在文件發送到服務器時處理請求,但文件只是空的。我讀的sqlite文件的內容錯了嗎? (我知道文件excist)你能看到我的代碼有什麼問題嗎?使用Qt發送二進制文件到服務器

QByteArray data; 
QFile file("database.sqlite"); 
if (!file.open(QIODevice::ReadWrite)) 
    return; 

QDataStream in(&file); 
in.setVersion(QDataStream::Qt_4_6); 
in >> data ; 

QString boundary; 
QByteArray dataToSend; // byte array to be sent in POST 

boundary="-----------------------------7d935033608e2"; 

QString body = "\r\n--" + boundary + "\r\n"; 
body += "Content-Disposition: form-data; name=\"database\"; filename=\"database.sqlite\"\r\n"; 
body += "Content-Type: application/octet-stream\r\n\r\n"; 
body += data; 
body += "\r\n--" + boundary + "--\r\n"; 
dataToSend = body.toAscii(); 

QNetworkAccessManager *networkAccessManager = new QNetworkAccessManager(this); 
QNetworkRequest request(QUrl("http://www.mydomain.com/upload.aspx")); 
request.setRawHeader("Content-Type","multipart/form-data; boundary=-----------------------------7d935033608e2"); 
request.setHeader(QNetworkRequest::ContentLengthHeader,dataToSend.size()); 
connect(networkAccessManager, SIGNAL(finished(QNetworkReply*)),this, SLOT(sendReportToServerReply(QNetworkReply*))); 
QNetworkReply *reply = networkAccessManager->post(request,dataToSend); // perform POST request 

回答

3

您不需要QDataStream。只是做

body += file.readAll() 
7

不要使用QString來寫體,而是使用QByteArray代替。 該行 body + = data;在大多數情況下, 不會追加整個文件。

data是一個QByteArray,當轉換成一個QString時,會在第一個\ 0處截斷。 您上傳的文件將無法使用。

使用鏈接中提供的示例中的一個答案。

+1

接受的答案是錯誤的,在您的答案中解釋的原因。感謝您清理它。 – 2012-12-21 18:35:59

相關問題