Qt获取Amazon S3文件的内容长度

时间:2013-09-25 00:03:35

标签: qt amazon-web-services amazon-s3 http-headers http-content-length

我想在我的Qt应用程序中获取托管在Amazon S3上的文件的文件大小。

以下代码适用于非S3文件,但对于已签名的S3链接,它会打印出QVariant(Invalid)

似乎Content-Length不在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);
}

1 个答案:

答案 0 :(得分: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();
}