如何将文件上传到盒子?我有卷曲代码

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 设置给其他用户帖子。

以上是关于如何将文件上传到盒子?我有卷曲代码的主要内容,如果未能解决你的问题,请参考以下文章

Python 请求 - 上传 Zip 文件

如何使用 Jquery EasyUI 将文件上传到 DB mysql?

将文件上传到 Firebase 存储并获取 downloadUrl。如何在 Kotlin 函数中返回结果?

如何通过 PHP 使用 curl 上传文件 [关闭]

如何使用 alamofire 上传多个文件并显示进度?

如何使用curl使用php上传文件[关闭]