2

QNAM を使用して、ftp プロトコルを使用してアップロードを処理します。プロセス全体は機能しますが、奇妙な動作があります。

これは私の方法です:

void ftp::uploadFile(const QString &origin, const QString &destination)
{
    QUrl url("ftp://"+host+""+destination);
    url.setUserName(user);
    url.setPassword(pwd);
    url.setPort(21);

    localFile = new QFile(origin, this);
    if (localFile->open(QIODevice::ReadOnly))
    {
         reply = nam->put(QNetworkRequest(url), localFile);
         QObject::connect(reply, SIGNAL(uploadProgress(qint64, qint64)), SLOT(transferProgress(qint64, qint64)));        
         QObject::connect(reply, SIGNAL(finished()), this, SLOT(transferFinished()));
    }
    else qDebug() << localFile->errorString();
}

ファイルをアップロードすると、uploadProgress が発行されます。

qDebug() << sent << "/" << total;

x/x まで 0/x を出力します。その後、完了信号が送信されるまでに、おそらく最大 20 秒ほど長い時間がかかります。なぜこの遅延?

私は終了した信号を無視して、進行中のときに自分で信号を発信sent==totalしようとしまし たが、ファイルはもう一方の端で破損しています。(私はjpgのみを送信するので、実際には破損していません。結果のファイルは上半分のみのjpgです。大きな部分は灰色です。)

100% が実際にプロセスが完了したことを意味するプログレス バーをユーザーに提供したいと考えています。5 秒間アップロードしてから、100% で 20 秒間維持するのはあまり良くありません。

4

1 に答える 1

0

ファイルのアップロードはバックグラウンドでバッファリング (qt ソケット バッファ、システム ソケット バッファ、ネットワーク バッファ) を行うため、「進行状況」シグナルは、データをどこかに送信したか、サーバーが受信したことを意味します。リモート側に転送されたすべてのデータとバッファがフラッシュされると、「終了」シグナルが発行されます。転送された正確なサイズを知る必要がある場合は、リクエストまたはソケットを無効にするか、qnam バッファリング/キャッシングを探すことができます。

于 2014-09-02T20:09:08.580 に答える