1

私のアプリには、ファイルをサーバーにアップロードする方法がありますが、これは正常に機能します。

しかし、このメソッドを一度に複数回呼び出すと (chooseFilesDialog の結果を反復処理するなど)、最初の 7 個 (多かれ少なかれ) のファイルが正しくアップロードされ、他のファイルはアップロードされません。

これは、サーバーが同じソースからの X を超える接続を許可しないという事実とリンクしている必要があると思いますか?

アップロードが確立された無料の接続を待機するようにするにはどうすればよいですか?

これは私の方法です:

QString Api::FTPUpload(QString origin, QString destination)
{
    qint64 timestamp = QDateTime::currentMSecsSinceEpoch();
    QUrl url("ftp://ftp."+getLSPro("domain")+destination);
    url.setUserName(getLSPro("user"));
    url.setPassword(getLSPro("pwd"));

    QFile *data = new QFile(origin, this);
    if (data->open(QIODevice::ReadOnly))
    {
        QNetworkAccessManager *nam = new QNetworkAccessManager();
        QNetworkReply *reply = nam->put(QNetworkRequest(url), data);
        reply->setObjectName(QString::number(timestamp));
        connect(reply, SIGNAL(uploadProgress(qint64, qint64)), SLOT(uploadProgress(qint64, qint64)));

        return QString::number(timestamp);
    }
    else
    {
        qDebug() << "Could not open file to FTP";
        return 0;
    }
}

void Api::uploadProgress(qint64 done, qint64 total) {
    QNetworkReply *reply = (QNetworkReply*)sender();
    emit broadCast("uploadProgress","{\"ref\":\""+reply->objectName()+"\" , \"done\":\""+QString::number(done)+"\", \"total\":\""+QString::number(total)+"\"}");
}
4

1 に答える 1

0

まず、アップロードを開始するたびに QNetworkManager を作成しないでください。
2 番目に、必ずすべてを削除する必要がありますnew()。そうしないと、メモリ リークが発生します。これにはQFile、、QNetworkManagerおよびQNetworkReply(!) が含まれます。第三に、信号
を待つ必要があります。finished()

Api::Api() {  //in the constructor create the network access manager
    nam = new QNetworkAccessManager()
    QObject::connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(finished(QNetworkReply*)));
}

Api::~Api() {  //in the destructor delete the allocated object
    delete nam;
}

bool Api::ftpUpload(QString origin, QString destination) {
    qint64 timestamp = QDateTime::currentMSecsSinceEpoch();
    QUrl url("ftp://ftp."+getLSPro("domain")+destination);
    url.setUserName(getLSPro("user"));
    url.setPassword(getLSPro("pwd"));

    //no allocation of the file object;
    //will automatically be destroyed when going out of scope
    //I use readAll() (see further) to fetch the data
    //this is OK, as long as the files are not too big
    //If they are, you should allocate the QFile object
    //and destroy it when the request is finished
    //So, you would need to implement some bookkeeping,
    //which I left out here for simplicity
    QFile file(origin);
    if (file.open(QIODevice::ReadOnly)) {
        QByteArray data = file.readAll();   //Okay, if your files are not too big
        nam->put(QNetworkRequest(url), data);
        return true;

        //the finished() signal will be emitted when this request is finished
        //now you can go on, and start another request
    }
    else {
      return false;
    }
}

void Api::finished(QNetworkReply *reply) {
    reply->deleteLater();  //important!!!!
}
于 2013-08-24T12:07:31.533 に答える