knobtviker
19th December 2010, 12:30
Can someone please explain to me how to upload files which are bigger than available memory?
I looked at every example and they all load complete files with readAll() and then send them.
This is not an option for me on S60 platform coz I hit Out-of-memory error.
I tried to do it with QNetworkAccessManager:: post() method and I failed.
Now, I'm trying to use QTcpSocket, but I don't know how to send and format the header before sending content??
I attached a part of my code:
tcpSocket = new QTcpSocket();
QString param = "upload.txt";
QNetworkAccessManager *http_upload = new QNetworkAccessManager(this);
QNetworkRequest requpl;
QString toDropboxDir = metadata.value("path");
if (!toDropboxDir.isEmpty())
{
toDropboxDir = toDropboxDir.right(toDropboxDir.size()-1);
}
std::string stuff_std = OAuthWebRequestUpload("http://api-content.dropbox.com/0/files/dropbox/"+toDropboxDir.toStdString(),"POST",consumerKey,consumerSecret,token,secret,"",param.toStdString());
QString stuff = QString::fromStdString(stuff_std);
QByteArray stuff_BA;
stuff_BA = stuff.toAscii();
qsrand(QDateTime::currentDateTime().toTime_t());
QString boundary_random = QVariant(qrand()).toString()+QVariant(qrand()).toS tring()+QVariant(qrand()).toString();
QString crlf("\r\n");
QString boundaryStr("---------------------------"+boundary_random);
QString boundary="--"+boundaryStr+crlf;
tcpSocket->connectToHost("api-content.dropbox.com",80);
connect(tcpSocket, SIGNAL(connected()), this, SLOT(filler()));
connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(erase_multipartform()));
//setting header to the request (with neccessary OAuth authorization)
requpl.setUrl(QUrl(QString("http://api-content.dropbox.com/0/files/dropbox/"+metadata.value("path"))+"?file="+param));
requpl.setRawHeader("Authorization", stuff_BA);
requpl.setHeader(QNetworkRequest::ContentTypeHeade r, "multipart/form-data; boundary="+boundaryStr);
QFile *file_upload = new QFile(param_path);
file_upload->open(QIODevice::ReadOnly);
//sending content
QByteArray payload;
QDataStream stream(&payload, QIODevice::WriteOnly);
stream.setVersion(QDataStream::Qt_4_7);
stream << "Authorization "+stuff;
qDebug() << "Authorization "+stuff;
stream << "--"+boundaryStr << "\r\n";
//qDebug() << "--"+boundaryStr << "\r\n";
stream << "Content-Disposition: form-data; name=\"file\"; filename=\""+param+"\"" << "\r\n";
//qDebug() << "Content-Disposition: form-data; name=\"file\"; filename=\""+param+"\"" << "\r\n";
stream << "Content-Type: text/plain" << "\r\n" << "\r\n";
//qDebug() << "Content-Type: "+param_mime << "\r\n" << "\r\n";
int iBlock = 0;
while(!file_upload->atEnd())
{
qDebug()<<"Reading Line: "<<++iBlock;
//stream << (quint16)0;
//stream << file_upload->readLine().data();
stream << file_upload->readAll().data();
tcpSocket->write(payload);
tcpSocket->flush();
//qDebug() << QString(file_upload->readAll().constData());
payload.clear();
}
file_upload->close();
stream << "\r\n" << "--"+boundaryStr+"--" << "\r\n";
//qDebug() << "\r\n" << "--"+boundaryStr+"--" << "\r\n";
reply_upload = http_upload->post(requpl,payload);
connect(reply_upload, SIGNAL(finished()), this, SLOT(readData_upload()));
Please help me, I'm stuck on this for days now... :(
I looked at every example and they all load complete files with readAll() and then send them.
This is not an option for me on S60 platform coz I hit Out-of-memory error.
I tried to do it with QNetworkAccessManager:: post() method and I failed.
Now, I'm trying to use QTcpSocket, but I don't know how to send and format the header before sending content??
I attached a part of my code:
tcpSocket = new QTcpSocket();
QString param = "upload.txt";
QNetworkAccessManager *http_upload = new QNetworkAccessManager(this);
QNetworkRequest requpl;
QString toDropboxDir = metadata.value("path");
if (!toDropboxDir.isEmpty())
{
toDropboxDir = toDropboxDir.right(toDropboxDir.size()-1);
}
std::string stuff_std = OAuthWebRequestUpload("http://api-content.dropbox.com/0/files/dropbox/"+toDropboxDir.toStdString(),"POST",consumerKey,consumerSecret,token,secret,"",param.toStdString());
QString stuff = QString::fromStdString(stuff_std);
QByteArray stuff_BA;
stuff_BA = stuff.toAscii();
qsrand(QDateTime::currentDateTime().toTime_t());
QString boundary_random = QVariant(qrand()).toString()+QVariant(qrand()).toS tring()+QVariant(qrand()).toString();
QString crlf("\r\n");
QString boundaryStr("---------------------------"+boundary_random);
QString boundary="--"+boundaryStr+crlf;
tcpSocket->connectToHost("api-content.dropbox.com",80);
connect(tcpSocket, SIGNAL(connected()), this, SLOT(filler()));
connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(erase_multipartform()));
//setting header to the request (with neccessary OAuth authorization)
requpl.setUrl(QUrl(QString("http://api-content.dropbox.com/0/files/dropbox/"+metadata.value("path"))+"?file="+param));
requpl.setRawHeader("Authorization", stuff_BA);
requpl.setHeader(QNetworkRequest::ContentTypeHeade r, "multipart/form-data; boundary="+boundaryStr);
QFile *file_upload = new QFile(param_path);
file_upload->open(QIODevice::ReadOnly);
//sending content
QByteArray payload;
QDataStream stream(&payload, QIODevice::WriteOnly);
stream.setVersion(QDataStream::Qt_4_7);
stream << "Authorization "+stuff;
qDebug() << "Authorization "+stuff;
stream << "--"+boundaryStr << "\r\n";
//qDebug() << "--"+boundaryStr << "\r\n";
stream << "Content-Disposition: form-data; name=\"file\"; filename=\""+param+"\"" << "\r\n";
//qDebug() << "Content-Disposition: form-data; name=\"file\"; filename=\""+param+"\"" << "\r\n";
stream << "Content-Type: text/plain" << "\r\n" << "\r\n";
//qDebug() << "Content-Type: "+param_mime << "\r\n" << "\r\n";
int iBlock = 0;
while(!file_upload->atEnd())
{
qDebug()<<"Reading Line: "<<++iBlock;
//stream << (quint16)0;
//stream << file_upload->readLine().data();
stream << file_upload->readAll().data();
tcpSocket->write(payload);
tcpSocket->flush();
//qDebug() << QString(file_upload->readAll().constData());
payload.clear();
}
file_upload->close();
stream << "\r\n" << "--"+boundaryStr+"--" << "\r\n";
//qDebug() << "\r\n" << "--"+boundaryStr+"--" << "\r\n";
reply_upload = http_upload->post(requpl,payload);
connect(reply_upload, SIGNAL(finished()), this, SLOT(readData_upload()));
Please help me, I'm stuck on this for days now... :(