2013-06-21 21 views
6

Tôi đang làm việc trong Qt 5 và đang gặp khó khăn với tải lên nhiều phần. Kịch bản của tôi là càng gần với docs càng tốt:QHttpMultiPart: đăng tệp lên tập lệnh PHP

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))); 

sau đó uploadReply() khe của tôi chỉ in câu trả lời:

QString data = (QString) reply->readAll(); 
qDebug() << data; 

tôi đã thực hiện các script upload cũng đơn giản càng tốt và chạy trong XAMPP với Apache/2.2.21 và PHP 5.3.8. Upload_max_filesize và post_max_size của tôi là 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']; 

Vị trí tiến trình của tôi hiển thị số lượng đúng byte được tải lên.

Nhưng các chương trình đầu ra:

preview_path: C:/preview.jpg 
preview_file exists: true 
$_FILES: Array 
(
) 
preview_file content: ???? 

Nó có vẻ như các byte sẽ được gửi như $ _POST biến chứ không phải là $ _file như họ nên được? Không có lỗi trong nhật ký apache. Làm thế nào tôi có thể gỡ lỗi này?

Trả lời

8

Giải quyết!

Nhờ this question cho gợi ý - tôi đã thêm 'tên tệp' vào bố cục nội dung cho QHttpPart và giờ đây nó tải lên như mong đợi. Tôi nghĩ rằng tên tập tin là tùy chọn nhưng dường như làm việc trong trường hợp này. Hy vọng điều này sẽ giúp người khác!

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 + "\"")); 
+1

PHP của tôi nói điều này: '' 'Cảnh báo: Thiếu ranh giới trong dữ liệu POST/dữ liệu biểu mẫu trong Không xác định trên dòng 0''' Có ​​cách nào để gỡ lỗi không? –