2016-10-27 3 views
0

Я пытаюсь сделать функцию, которая загружает изображение в imgur, и функция работает в форме ниже, но иначе, чем я ожидал.Как передать несколько параметров при загрузке изображения в imgur

bool ImgurUploader::upload(QImage image) 
{ 
    QByteArray byteArray; 
    QBuffer buffer(&byteArray); 
    image.save(&buffer, "PNG");  

    QByteArray params; 
    params.append(byteArray.toBase64()); 

    QNetworkRequest request; 
    request.setUrl(QUrl("https://api.imgur.com/3/image")); 
    request.setRawHeader("Content-Type", "application/application/x-www-form-urlencoded"); 
    request.setRawHeader("Authorization", "Client-ID 16d41e28a3ba71e"); 

    mAccessManager->post(request, params); 
} 

Я ожидал, что и пытается сначала передать из параметров изображения в форме, как это:

params.append("image="); 
params.append(byteArray.toBase64()); 

Но когда я делаю, я получаю «400 Bad Request» и ошибка «Недопустимый URL ».

Как отправить несколько параметров? Я использую неправильный подход?

ответ

1

Вы можете взглянуть на их Android Upload Example.

Если вы посмотрите на запрос на отправку here, вы увидите, что параметры не отправляются в теле запроса POST (как вы пытаетесь сделать). Вместо этого они представляют собой запросы, которые добавляются к URL-адресу (это можно сделать в Qt, используя QUrlQuery), изображение отправлено в тело запроса, и нет необходимости его кодировать с использованием base64 (это лучше поскольку он может сэкономить некоторый сетевой трафик).

Вот как ваша функция загрузки должна выглядеть следующим образом:

bool ImgurUploader::upload(QImage image, QString title, QString description) 
{ 
    QByteArray byteArray; 
    QBuffer buffer(&byteArray); 
    image.save(&buffer, "PNG");  

    QUrlQuery urlQuery; 
    urlQuery.addQueryItem("title", title); 
    urlQuery.addQueryItem("description", description); 

    QNetworkRequest request; 
    QUrl url("https://api.imgur.com/3/image"); 
    url.setQuery(urlQuery); 
    request.setUrl(url); 
    request.setHeader(QNetworkRequest::ContentTypeHeader, 
         "application/application/x-www-form-urlencoded"); 
    request.setRawHeader("Authorization", "Client-ID 16d41e28a3ba71e"); 

    mAccessManager->post(request, byteArray); 
} 
+0

Именно то, что я искал! Хотя я использую Qt 4.8 и QUrlQuery был представлен в Qt 5.0, поэтому я должен использовать QList с QPair, но он работает по желанию, многие thnaks! 'QList > urlQuery; urlQuery.append (qMakePair (QString («title»), QString («MyTitle»))); urlQuery.append (qMakePair (QString («описание»), QString («MyDescription»))); ' –

Смежные вопросы