1

我想在我的Qt應用程序中獲取託管在Amazon S3上的文件的文件大小。Qt獲取Amazon S3文件的內容長度

下面的代碼的偉大工程,對於非S3文件,但對於簽署S3鏈接它打印出QVariant(Invalid)

看來,內容長度是不是在S3 HTTP標頭......讓我怎麼弄文件大小?

void MainWindow::requestFileSize(QString url) 
{ 
    QNetworkRequest req; 
    m_netmanager = new QNetworkAccessManager(this); 
    QUrl strict_url = QUrl::fromEncoded(url.toStdString().c_str(),QUrl::StrictMode); 
    req.setUrl(strict_url); 
    m_reply = m_netmanager->head(req); 
    connect(m_reply, SIGNAL(metaDataChanged()), this, SLOT(fileSize())); 
} 

void MainWindow::fileSize() 
{ 
    qDebug() << "Content Length: " << m_reply->header(QNetworkRequest::ContentLengthHeader); 
} 
+0

以供將來參考,請張貼一個自包含的代碼,我們可以建立和運行。 – lpapp

+0

@stukennedy可以發佈鏈接,以便驗證內容長度標題是否實際存在於響應標題中。 –

+0

很容易將我發佈的代碼放到一個新的項目中並構建它(只需要頭部定義幷包含依賴項),而無需使用與該問題無關的代碼混淆帖子。希望沒關係...無論如何,請看下面的解決方案,只是想通了。 – stukennedy

回答

0

我已經想出瞭如何解決這個問題。

看起來像Amazon S3不會讓您在頭部請求中看到整個HTTP標頭......但您可以執行GET,檢索標頭,然後刪除回覆而不會收到任何正文。

這工作:

void MainWindow::requestFileSize(const QString &url) 
{ 
    QNetworkRequest req; 
    m_netmanager = new QNetworkAccessManager(this); 
    req.setUrl(QUrl(url)); 
    m_reply = m_netmanager->get(req); 
    connect(m_reply, SIGNAL(metaDataChanged()), this, SLOT(fileSize())); 
} 

void MainWindow::fileSize() 
{ 
    qDebug() << "Content Length: " << m_reply->header(QNetworkRequest::ContentLengthHeader); 
    m_reply->deleteLater(); 
    m_netmanager->deleteLater(); 
}