Wysyłanie pliku na serwer (ftp) - QIODevice::read: device not open

0

Witam,
mam 'dziwny' problem, ponieważ nie wiem dlaczego pomimo poprawnego przesłania pliku na serwer wyświetlany mam komunikat QIODevice::read: device not open. Ogólnie komunikat w założeniu dotyczy operacji na pliku (w tym przypadku jego czytania), ale nie wiem co tutaj jest dokładnie problemem..

Działam na Qt 5.3, więc stara biblioteka QFTP tutaj nie obowiązuje..

Problem występuje w momencie gdy 'obecna' jest ta linijka kodu:reply = nam.put(QNetworkRequest(url), putData); odpowiedzialna za wysyłkę danych na serwer :P

Kod :

 
#include "uploader.h"

Uploader::Uploader(QObject *parent) :
    QObject(parent)
{
}

void Uploader::start(const QString &fileName) {
    QUrl url("ftp://adresIP/test/song.mp3");
    url.setUserName("[email protected]");
    url.setPassword("passwd");

    file = new QFile(fileName);

    QByteArray putData;

    file->open(QIODevice::ReadOnly);

    putData.append(file->readAll());

    //-- różne eksperymenty..
    file->flush();
    file->close();
    delete file;
    //--

    reply = nam.put(QNetworkRequest(url), putData);
    connect(reply, SIGNAL(uploadProgress(qint64, qint64)), this, SLOT(uploadProgress(qint64, qint64)));
    connect(reply, SIGNAL(finished()), this, SLOT(uploadDone()));

}


void Uploader::uploadProgress(qint64 bytesSent, qint64 bytesTotal) {
    qDebug() << "Uploaded" << bytesSent << "of" << bytesTotal;
}

void Uploader::uploadDone() {
    qDebug() << "Finished" << reply->error();

    reply->deleteLater();
}

//uploader.h
   QNetworkAccessManager nam;
   QFile *file;
   QNetworkReply *reply;

//main.cpp
Uploader u;
u.start("F:\\song.mp3");

Screen problemu w załączniku.

0
  1. Czy na pewno Twój plik znajduje się tam, gdzie pokazuje ścieżka ? "F:\" i ma nazwę song.mp3 ?
  2. Upewnij się, że Twój plik jest otwierany pomyślnie. Następnie nie zamykaj go i zamiast wysyłać QByteArray wyślij file
    reply = nam.put(QNetworkRequest(url), file); Po zakończonym przesyłaniu zamknij plik i usuń wskaźnik [delete]
0

@Resident

  1. Sprawdzone jeszcze raz.
  2. Sprawdzone jeszcze raz.

Ogólnie o tym co wspomniałeś miałem chyba okazje sprawdzać..

Wcześniej też testowałem taki kod:

 
    if (file->open(QIODevice::ReadOnly)) {
        reply = nam.put(QNetworkRequest(url), file);
        connect(reply, SIGNAL(uploadProgress(qint64, qint64)), this, SLOT(uploadProgress(qint64, qint64)));
        connect(reply, SIGNAL(finished()), this, SLOT(uploadDone()));
    }

Po zakończonym przesyłaniu zamknij plik i usuń wskaźnik [delete]

  • czyli w którym momencie proponujesz ? Ja to robiłem po sygnale finished().. Ogólnie próbowałem już trochę 'sposobów'..

ps. Jakbym miał okazje o uruchomić to byłbym rad .. bo może coś u mnie jest nie teges ...

0

Ostatni hint gdyż nigdy nie pracowałem z modułem FTP w Qt.
Odnosisz się linkiem do : QUrl url("ftp://adresIP/test/tt.txt");
A wysyłasz u.start("F:\song.mp3");
Nie powinno być QUrl url("ftp:*adresIP/test/song.mp3"); ? Albo też samo ftp:*adresIP/test/ aby wskazać katalog ? Spróbuj te 2 wersje

0

Nie tylko ty masz taki problem: http://qt-project.org/forums/viewthread/31758
Znalazłem też przykład dla Qt4: http://qt-project.org/doc/qt-4.8/webkit-webftpclient.html ale to chyba się nie stosuje dla Qt5.

0

@MarekR22 - he, bodajże ktoś z Chin też to zauważył...

Ogólnie miałem okazje dzisiaj zrobić test pod Ubuntu, Qt 5.0.1 (a nawet Qt 4.7) i tam błąd ten nie występuje.. Wygląda na to, że albo to jest bug samego frameworka albo trzeba jeszcze coś dodać w kodzie dla tej (5.3) wersji Qt..

1 użytkowników online, w tym zalogowanych: 0, gości: 1