2013-06-21 3 views
6

Qt 5에서 일하고 있으며 멀티 파트 업로드로 고생 중입니다. 내 uploadReply() 슬롯 바로 답장 인쇄 후QHttpMultiPart : 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))); 

: 내가 업로드 스크립트를 만든

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

을 가능하고 실행하는 것만 큼 간단 내 스크립트 docs 가능한 한가에 가까운입니다 Apache/2.2.21 및 PHP 5.3.8의 XAMPP 내 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보다 그들이해야대로로 제출되고있다? 아파치 로그에 오류가 없습니다. 어떻게 디버깅 할 수 있습니까?

답변

8

해결!

힌트에 대해 this question에게 감사드립니다. QHttpPart에 대한 콘텐츠 처리에 '파일 이름'을 추가했는데 이제 예상대로 업로드됩니다. 파일 이름은 선택 사항이지만이 경우에는 작동하는 것으로 보입니다. 희망이 다른 사람을 도와주세요! ```경고 : 라인에 알 수없는에서 다중/폼 데이터 POST 데이터의 경계를 누락 0```이를 디버깅 할 수있는 방법이 있나요

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는이 말한다? –