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

Odpowiedz Nowy wątek
2014-08-25 15:22
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.

edytowany 2x, ostatnio: adamError, 2014-08-27 09:10

Pozostało 580 znaków

2014-08-25 23:01
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]

...
edytowany 2x, ostatnio: Resident, 2014-08-25 23:02

Pozostało 580 znaków

2014-08-25 23:32
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 ...

Pozostało 580 znaków

2014-08-26 23:52
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


...
edytowany 1x, ostatnio: Resident, 2014-08-26 23:53
@Resident - z tą ścieżką to sorry.. mój błąd.. robiłem testy na różnych plikach. Natomiast "Albo też samo ftp:adresIP/test/" tutaj akurat musi być dokładny adres, z uwzględnieniem wysyłanego pliku..(inaczej w ogólnie nie można przesłać pliku). - adamError 2014-08-27 09:31

Pozostało 580 znaków

2014-08-27 15:46
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.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

2014-08-27 16:32
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..

edytowany 2x, ostatnio: adamError, 2014-08-27 16:34

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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