Как загрузить файлы в бокс? у меня есть код завитка

Я интегрирую облако коробок в свое приложение. Я работаю с платформой Qt.

В документации коробки они сказали публиковать вот так, который находится в завитке.

curl https://upload.box.com/api/2.0/files/content \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-F filename=@FILE_NAME \
-F folder_id=FOLDER_ID 

где указать параметры filename и folder_id. Я попытался опубликовать в теле, но это дает ошибку. А так же подскажите пожалуйста куда выложить содержимое файла.

Спасибо.


person raju    schedule 29.08.2013    source источник


Ответы (4)


Я попытался опубликовать данные с multipart/form-data с помощью Qt API. Я не знаком с использованием libcurl в Qt. Но я добился успеха только с Qt API. Вот мой код.

multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

        QByteArray boundary("56354654654654321768987465413574634354658");
        multiPart->setBoundary(boundary);

        QHttpPart folderPart;
        folderPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"folder_id\""));
        folderPart.setBody(folderId.toUtf8());

        QString fileExt = fileToUpload.split(".").takeLast();
        QString mimeType = FileUtilities::getMIMEType("." + fileExt);

        QString fileName = fileToUpload.split("/").takeLast();
        qDebug() << "file name to upload : " << fileName;

        QHttpPart textPart;
        textPart.setHeader(QNetworkRequest::ContentTypeHeader, mimeType);
        textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; filename=\""+ fileName +"\"; name=\"filename\";"));

        QFile *fileUpload = new QFile(fileToUpload);
        fileUpload->open(QIODevice::ReadOnly);

        textPart.setBodyDevice(fileUpload);

        multiPart->append(textPart);
        multiPart->append(folderPart);
req.setUrl(QUrl("https://upload.box.com/api/2.0/files/content"));
QByteArray ba_auth = QString("Bearer " + m_accessToken).toUtf8();
req.setRawHeader("Authorization", ba_auth);


m_netManager->post(req, multiPart);

В ответе будут сведения о файле, загруженном на box.com. Спасибо всем за помощь в этой теме.

  • Раджу
person raju    schedule 03.09.2013

РЕДАКТИРОВАТЬ: Похоже, вы удалили свой тег PHP сразу после того, как я опубликовал свой ответ. Возможно, это не имеет отношения к вашему вопросу.

Похоже, что в документации коробки рассказывается, как выполнить перенос curl из командной строки Linux. Нам просто нужно перевести это на PHP.

В вашем PHP вам сначала нужно получить путь к вашему файлу соответствующим образом:

$filePath = realpath('./file_name');

Сохраните токен доступа в переменной для последующего использования:

$accessToken = "YOUR_ACCESS_TOKEN";

Затем вам нужно настроить дескриптор curl:

$ch = curl_init();

Поместите данные POST в массив. Это эквивалентно тому, что находится в этих аргументах -F:

$post = array('filename'=>'@'.$filePath, 'folder_id'=>'my_fave_folder');

Затем вам нужно установить определенные параметры завитка:

curl_setopt($ch, CURLOPT_URL, "https://upload.box.com/api/2.0/files/content");
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization: Bearer $accessToken"));

Затем вы выполняете curl и фиксируете ответ в $result, который вы можете echo изучить:

$result=curl_exec($ch);
curl_close($ch);
echo $result;

Возможно, вам придется также установить некоторые параметры SSL, так как вы доступ через https.

person DeeDee    schedule 29.08.2013
comment
Могу ли я получить эквивалентный код qt для этого? Я из фона Qt. - person raju; 30.08.2013

EDIT: при использовании PHP. Для QT проверьте другой вопрос StackOverflow о том, как отправлять запросы libcurl через C++

Вы также можете использовать этот заголовок для общих целей:

$defaultOptions = array(
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_VERBOSE        => true,
    CURLOPT_HEADER         => false,
    CURLINFO_HEADER_OUT    => false,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => false,
);

и вы можете установить его с помощью функции curl_setopt_array():

curl_setopt_array($curlhandle, $defaultOptions);
person Lucaci Andrei    schedule 02.09.2013

Дополнительно хочу заметить, что способ, указанный в официальной документации, не работает. Я попытался реализовать решение из https://developer.box.com/reference#upload-a-file, который выглядит так:

curl https://upload.box.com/api/2.0/files/content \ 
  -H "Authorization: Bearer ACCESS_TOKEN" -X POST \
  -F attributes='{"name":"tigers.jpeg", "parent":{"id":"11446498"}}' \
  -F [email protected]

Но у меня постоянно возникает ошибка "неверный запрос" с сервера. Но решение, показанное Раджу, все еще работает. Может кто знает как это реализовать в QT.

person Александр Степаненко    schedule 25.10.2017
comment
Честно говоря, это больше похоже на комментарий. - person mrun; 25.10.2017
comment
Извините за это, но я по-прежнему не могу оставлять комментарии к другим постам - моей репутации не хватает... Мне нужно не менее 50 репутации, чтобы ставить комментарии к постам других пользователей. - person Александр Степаненко; 26.10.2017