Я ищу базовые примеры кода о том, как загрузить файлы на сервер методом HTTP POST на Qt.
Моя задача : У меня есть простая программа Qt, и мне нужно выбрать любой файл изображения с локального хоста и загрузить его на сервер. Часть выбора и графический интерфейс просты, и я уже сделал это, но с загрузкой POST я запутался. Кроме того, я должен сказать, что нет разрешения на загрузку файла.
Если кто-то уже ищет эту тему?
PS: причина, по которой я спрашиваю, а не кодирую себя, это время, мне нужно быстро освоить этот метод.
Спасибо, все успешные решения с моей стороны будут публиковаться здесь для других.
ДОБАВЛЕНО: Вот мой код, который еще не работает. Загрузить сайт, расположенный здесь .
void CDialog::on_uploadButton_clicked() {
QFileInfo fileInfo(absPathLineEdit->text());
if (!fileInfo.exists()) {
QMessageBox::information(this,
tr("Information"),
tr("File doesn't exists! Please, select another image."));
return;
}
file = new QFile(fileInfo.filePath());
if (!file->open(QIODevice::ReadOnly)) {
QMessageBox::information(this,
tr("Information"),
tr("Unable to open file for reading!"));
return;
}
QString host = "http://data.cod.ru";
QUrl url(host);
QHttp::ConnectionMode mode = QHttp::ConnectionModeHttp;
http->setHost(url.host(), mode, (url.port() == -1) ? 80 : url.port());
QHttpRequestHeader header("POST", "/", 1, 1);
header.setValue("Host", "data.cod.ru");
header.setValue("Content-type", "multipart/form-data, boundary=AaB03x");
header.setValue("Cache-Control", "no-cache");
header.setValue("Accept", "*/*");
QByteArray bytes(fileInfo.filePath().toUtf8());
QByteArray totalBytes;
totalBytes.append("--AaB03x\r\n");
totalBytes.append("Content-Disposition: form-data; name=\"email\"\r\n");
totalBytes.append("\r\n");
totalBytes.append("billgates@microsoft.com\r\n");
totalBytes.append("--AaB03x\r\n");
totalBytes.append("Content-Disposition: form-data; name=\"photo\"; filename=\"" + bytes+ "\"\r\n");
totalBytes.append("Content-Transfer-Encoding: binary\r\n\r\n");
totalBytes.append(file->readAll());
totalBytes.append("\r\n");
totalBytes.append("--AaB03x--");
header.setContentLength(totalBytes.length());
httpRequestAborted = false;
httpGetId = http->request(header, totalBytes);
file->close();
}
и прочитайте функцию ответа ниже:
void CDialog::httpRequestFinished(int requestId, bool error) {
if (requestId != httpGetId)
return;
if (httpRequestAborted) {
if (file) {
file->close();
// file->remove();
// delete file;
file = 0;
}
return;
}
if (requestId != httpGetId)
return;
file->close();
if (error) {
// file->remove();
QMessageBox::information(this, tr("HTTP"),
tr("Download failed: %1.")
.arg(http->errorString()));
} else {
QByteArray data = http->readAll();
QFile *dataFile = new QFile("answer.txt");
dataFile->open(QIODevice::WriteOnly | QIODevice::Text);
dataFile->write(data);
dataFile->flush();
dataFile->close();
}
// delete file;
file = 0;
}