Я работаю в Qt 5 и борюсь с многостраничной загрузкой. Мой сценарий как можно ближе к документам :
QUrl testUrl("http://localhost/upload/test.php"); QNetworkRequest request(testUrl); QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QString preview_path = "C:/preview.jpg"; QHttpPart previewPathPart; previewPathPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"preview_path\"")); previewPathPart.setBody(preview_path.toLatin1()); QHttpPart previewFilePart; previewFilePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant( "image/jpeg")); previewFilePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"preview_file\"")); QFile *file = new QFile(preview_path); if (!file->exists()) { emit error(tr("Upload Error. File does not exist: ") + preview_path); return; } file->open(QIODevice::ReadOnly); previewFilePart.setBodyDevice(file); file->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPart multiPart->append(previewPathPart); multiPart->append(previewFilePart); reply = networkManager->post(request, multiPart); multiPart->setParent(reply); // delete the multiPart with the reply connect(reply, SIGNAL(finished()), this, SLOT (uploadReply())); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT (uploadError(QNetworkReply::NetworkError))); connect(reply, SIGNAL(uploadProgress(qint64, qint64)), this, SLOT (uploadProgress(qint64, qint64)));
то мой слот uploadReply () просто печатает ответ:
QString data = (QString) reply->readAll(); qDebug() << data;
Я сделал сценарий загрузки максимально простым и работает в XAMPP с Apache / 2.2.21 и PHP 5.3.8. Мои upload_max_filesize и post_max_size – 1000M.
echo "preview_path: " . (isset($_POST['preview_path']) ? $_POST['preview_path'] : "not set") . "\r\n"; echo "preview_file exists: " . (isset($_POST['preview_file']) ? "true" : "false" ). "\r\n"; echo '$_FILES: '; print_r($_FILES); echo "preview_file content: " . $_POST['preview_file'];
мой временной интервал показывает приблизительное количество загружаемых байтов.
Но вывод показывает:
preview_path: C:/preview.jpg preview_file exists: true $_FILES: Array ( ) preview_file content: ????
Кажется, что байты передаются как переменная $ _POST, а не $ _FILE, как и должно быть? В журнале apache нет ошибок. Как я могу отладить это?
Решено!
Благодаря этому вопросу для подсказки я добавил «filename» к размещению содержимого для QHttpPart, и теперь он загружается, как ожидалось. Я думал, что имя файла необязательно, но, похоже, работает в этом случае. Надеюсь, это поможет кому-то еще!
QString preview_name = "preview.jpg"; QHttpPart previewFilePart; previewFilePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg")); previewFilePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"preview_file\"; filename=\""+ preview_name + "\""));