如何将文件上传到盒子?我有卷曲代码
Posted
技术标签:
【中文标题】如何将文件上传到盒子?我有卷曲代码【英文标题】:How to upload files to box? I have curl code 【发布时间】:2013-08-29 14:05:20 【问题描述】:我正在将盒子云集成到我的应用程序中。我正在使用 Qt 平台。
在盒子文档中,他们说像这样在 curl 中发布。
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
在哪里指定文件名和folder_id 参数。我尝试过在正文中发帖,但它给出了错误。另外请告诉我在哪里发布文件内容。
谢谢。
【问题讨论】:
【参考方案1】:我尝试使用 Qt API 通过 multipart/form-data 发布。我不熟悉在 Qt 中使用 libcurl。但我只使用 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 的文件的详细信息。 感谢大家在这个话题上帮助我。
拉朱【讨论】:
【参考方案2】:编辑:看起来您在我发布答案后立即删除了您的 PHP 标记。那么这可能与您的问题无关。
box 文档似乎在告诉您如何从 linux 命令行执行 curl 传输。我们只需要把它翻译成 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 选项:
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;
您可能也需要set some SSL options,因为您是通过 https 访问的。
【讨论】:
我可以有 qt 等效代码吗?我来自 Qt 背景。【参考方案3】:编辑:如果使用 PHP。对于 QT,请查看有关如何通过 C++ 发送 libcurl 请求的其他 *** 问题
您也可以将此标头用于一般目的:
$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);
【讨论】:
【参考方案4】:另外我想注意到官方文档中显示的方式不起作用。 我尝试从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 file=@myfile.jpg
但我一直收到来自服务器的“错误请求”错误。但是 Raju 显示的解决方案仍然有效。 可能有人知道如何在 QT 中实现它。
【讨论】:
老实说,这看起来更像是一条评论。 对此很抱歉,但我仍然无法将 cmets 留给其他帖子 - 我的声誉还不够……我需要至少 50 个声誉才能将 cmets 设置给其他用户帖子。以上是关于如何将文件上传到盒子?我有卷曲代码的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Jquery EasyUI 将文件上传到 DB mysql?