{"id":26673616,"url":"https://github.com/devbean/qupyun","last_synced_at":"2025-07-15T11:43:33.392Z","repository":{"id":14892719,"uuid":"17616471","full_name":"devbean/QUpYun","owner":"devbean","description":"UpYun SDK for Qt.","archived":false,"fork":false,"pushed_at":"2014-03-13T02:48:09.000Z","size":164,"stargazers_count":7,"open_issues_count":0,"forks_count":5,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-12T06:13:23.394Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/devbean.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-03-11T02:56:31.000Z","updated_at":"2019-11-25T07:55:33.000Z","dependencies_parsed_at":"2022-08-19T19:10:30.499Z","dependency_job_id":null,"html_url":"https://github.com/devbean/QUpYun","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/devbean/QUpYun","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devbean%2FQUpYun","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devbean%2FQUpYun/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devbean%2FQUpYun/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devbean%2FQUpYun/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devbean","download_url":"https://codeload.github.com/devbean/QUpYun/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devbean%2FQUpYun/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265433024,"owners_count":23764206,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-26T01:36:59.305Z","updated_at":"2025-07-15T11:43:33.314Z","avatar_url":"https://github.com/devbean.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# QUpYun - 又拍云Qt SDK\n======\n\n`QUpYun`是又拍云存储的Qt SDK，基于[又拍云存储HTTP REST API接口](http://wiki.upyun.com/index.php?title=HTTP_REST_API接口)开发，适用于Qt 4.8.x/5.x版本(其它版本没有进行测试)。\n\n`QUpYun`使用`QNetworkAccessManager`进行网络访问。通常，一个应用程序仅需要一个`QUpYun`实例即可满足需要，不需要创建多个`QUpYun`对象。`QUpYun`提供的访问接口全部为异步访问模式，程序开发人员需要连接相应的信号获得又拍云服务器返回的数据。与此同时，`QUpYun`还提供了`requestError(QNetworkReply::NetworkError, const QString \u0026)`信号，用于处理可能发生的错误。\n\n## 目录\n* [云存储基础接口](#云存储基础接口)\n  * [准备操作](#准备操作)\n  * [上传文件](#上传文件)\n  * [下载文件](#下载文件)\n  * [获取文件信息](#获取文件信息)\n  * [删除文件](#删除文件)\n  * [创建目录](#创建目录)\n  * [删除目录](#删除目录)\n  * [获取目录文件列表](#获取目录文件列表)\n  * [获取空间使用量情况](#获取空间使用量情况)\n* [图片处理接口](#图片处理接口)\n  * [缩略图](#缩略图)\n  * [图片裁剪](#图片裁剪)\n  * [图片旋转](#图片旋转)\n  \n\u003ca name=\"云存储基础接口\"\u003e\u003c/a\u003e\n## 云存储基础接口\n\n\u003ca name=\"准备操作\"\u003e\u003c/a\u003e\n### 准备操作\n`QUpYun`的全部代码位于`source`目录中。在需要使用`QUpYun`的工程文件中引入`qupyun.pri`即可正常使用：\n```\ninclude(\"qupyun.pri\")\n```\n\n源代码文件中，我们可以通过下面语句引入`QUpYun`：\n```C++\n#include \u003cQUpYun\u003e\n```\n##### 创建空间\n用户需要自行在[又拍云网站](https://www.upyun.com/login.php)创建个性化空间。具体教程请参见[创建空间](http://wiki.upyun.com/index.php?title=创建空间)。\n\n##### 初始化QUpYun\n```C++\nQUpYun *upyun = new QUpYun(BucketName, Operator, Password, parent);\n```\n若不了解“授权操作员”，请参见[授权操作员](http://wiki.upyun.com/index.php?title=创建操作员并授权)\n\n##### 选择最优的接入点\n根据国内的网络情况，又拍云存储API目前提供了电信、联通网通、移动铁通三个接入点。我们可以通过`QUpYun`的接口进行设置：\n```C++\nupyun-\u003esetAPIDomain(QUpYun::ED_AUTO);\n```\n若没有明确进行设置，`QUpYun`默认将根据网络条件自动选择接入点。使用`apiDomain()`函数可以获取当前设置的接入点。\n\n接入点有四个值可选：\n\n* **QUpYun::ED_AUTO** ：根据网络条件自动选择接入点\n* **QUpYun::ED_TELECOM** ：电信接入点\n* **QUpYun::ED_CNC** ：联通网通接入点\n* **QUpYun::ED_CTT** ：移动铁通接入点\n\n_**注：**建议根据服务器网络状况，手动设置合理的接入点已获取最佳的访问速度。_\n\n\u003ca name=\"上传文件\"\u003e\u003c/a\u003e\n### 上传文件\n\n##### 基本用法\n\n`QUpYun`提供了两个用于上传的函数：\n```C++\nvoid uploadFile(const QString \u0026path,\n                const QString \u0026localPath,\n                bool autoMkdir = false,\n                bool appendFileMD5 = false,\n                const QString \u0026fileSecret = QString(),\n                const RequestParams \u0026params = RequestParams());\n\t\t\t\t\nvoid uploadFile(const QString \u0026path,\n                QFile *file,\n                bool autoMkdir = false,\n                bool appendFileMD5 = false,\n                const QString \u0026fileSecret = QString(),\n                const RequestParams \u0026params = RequestParams());\n```\n我们可以根据使用=文件路径还是文件对象区别使用这两个函数，例如：\n```C++\nQUpYun *upyun = new QUpYun(BucketName, Operator, Password, parent);\nconnect(upyun, \u0026QUpYun::requestUploadFinished, [=] (bool success, const PicInfo \u0026picInfo) {\n\t...\n});\n\t\t\t\t\t\t   \n// 使用文件所在路径\nupyun-\u003euploadFile(savePath, localFilePath);\n\n// 上传文件对象\nQFile file(localFilePath);\nupyun-\u003euploadFile(savePath, \u0026file);\n```\n\n##### 参数说明\n* `savePath`：上传到的又拍云存储的具体地址\n  * 比如`/dir/sample.jpg`表示以`sample.jpg`为文件名保存到`/dir`目录下；\n  * 若保存路径为`/sample.jpg`，则表示保存到根目录下；\n  * **注意`savePath`必须以`/`开始**，下同。\n* 第二个参数可以是`QString`或`QFile *`类型，即需要上传的文件路径或文件本身。\n* `autoMkdir`：可选的`bool`类型参数，表示当不存在父级目录时是否自动创建父级目录（只支持自动创建10级以内的父级目录）。\n* `appendFileMD5`：可选的`bool`类型参数，表示是否需要附加文件的MD5校验值。如果设置了该参数，上传时会附加被上传文件的MD5校验值。若又拍云服务器计算而得的文件MD5值与此不同，则服务器返回`406 Not Acceptable`错误。对于需要确保上传文件的完整性要求的业务，可以设置该参数。\n* `fileSecret`：可选的`QString`类型参数，表示是否添加文件访问密钥。该访问密钥仅支持图片空间。图片类空间若设置过[缩略图版本号](http://wiki.upyun.com/index.php?title=如何创建自定义缩略图)，即可使用原图保护功能（**文件类空间无效**）。如果设置了该参数，上传时会附加文件访问密钥。待文件保存成功后，将无法根据`http://空间名.b0.upaiyun.com/savePath`直接访问上传的文件，而是需要在URL后面加上`缩略图间隔标志符+密钥`进行访问。例如，[缩略图间隔标志符](http://wiki.upyun.com/index.php?title=如何使用自定义缩略图)为`!`，密钥为`abc`，上传的文件路径为`/dir/sample.jpg`，那么该图片的对外访问地址为: `http://空间名.b0.upaiyun.com/dir/sample.jpg!abc`。**注意，原图保护密钥若与[缩略图版本号](http://wiki.upyun.com/index.php?title=如何创建自定义缩略图)名称相同，则在对外访问时将被视为是缩略图功能，而原图将无法访问，请慎重使用。**\n* `params`：上传图片时，允许直接对图片进行旋转、裁剪、缩略图等操作，具体请参见[图片处理接口](#图片处理接口)。\n\n##### 其他说明\n* 文件上传成功后，可直接通过`http://空间名.b0.upaiyun.com/savePath`（或设置的自定义域名）访问文件。\n* 图片类空间上传文件后，会返回文件的基本信息，可通过信号的`PicInfo`参数获取。`PicInfo`会返回以下信息：\n  * **QString type**：图片类型\n  * **qulonglong width**：图片宽度\n  * **qulonglong height**：图片高度\n  * **qulonglong frames**：图片帧数\n\n##### 注意事项\n* 如果空间内`savePath`已经存在文件，将进行覆盖操作，并且是**不可逆**的。所以如果需要避免文件被覆盖的情况，可以先通过[获取文件信息](#获取文件信息)操作来判断是否已经存在旧文件。\n* 图片类空间只允许上传图片类文件，其他文件上传时将返回“不是图片”的错误。\n* 使用`requestError(QNetworkReply::NetworkError, const QString \u0026)`信号处理错误。\n\n\u003ca name=\"下载文件\"\u003e\u003c/a\u003e\n### 下载文件\n```C++\nQUpYun *upyun = new QUpYun(BucketName, Operator, Password, parent);\nconnect(upyun, \u0026QUpYun::requestDownloadFinished, [=] (const QByteArray \u0026data) {\n\t...\n});\n\nupyun-\u003edownloadFile(savePath);\n```\n\n##### 参数说明\n* `savePath`：又拍云存储中文件的具体保存地址。比如`/dir/sample.jpg`。\n\n##### 注意事项\n* 下载文件时必须确保空间下存在该文件，否则将返回`文件不存在`错误。\n* 使用`requestError(QNetworkReply::NetworkError, const QString \u0026)`信号处理错误。\n\n\u003ca name=\"获取文件信息\"\u003e\u003c/a\u003e\n### 获取文件信息\n```C++\nQUpYun *upyun = new QUpYun(BucketName, Operator, Password, parent);\nconnect(upyun, \u0026QUpYun::requestFileInfoFinished, [=] (const FileInfo \u0026fileInfo) {\n\t...\n});\n\nupyun-\u003edownloadFile(savePath);\n```\n`FileInfo`可以获得以下文件信息：\n* **QString type**：文件类型\n* **qulonglong size**：文件大小\n* **QDateTime createDate**：创建日期\n\n##### 参数说明\n* `savePath`：又拍云存储中文件的具体保存地址。比如`/dir/sample.jpg`。\n\n##### 其他说明\n* 若文件不存在，则返回错误。\n* 使用`requestError(QNetworkReply::NetworkError, const QString \u0026)`信号处理错误。\n\n\u003ca name=\"删除文件\"\u003e\u003c/a\u003e\n### 删除文件\n```C++\nQUpYun *upyun = new QUpYun(BucketName, Operator, Password, parent);\nconnect(upyun, \u0026QUpYun::requestRemoveFileFinished, [=] (bool success) {\n\t...\n});\n\nupyun-\u003eremoveFile(savePath);\n```\n    \n##### 参数说明\n* `savePath`：又拍云存储中文件的具体保存地址。比如`/dir/sample.jpg`。\n\n##### 其他说明\n* 删除文件时必须确保空间下存在该文件，否则将返回`文件不存在`的错误。\n* 使用`requestError(QNetworkReply::NetworkError, const QString \u0026)`信号处理错误。\n\n\u003ca name=\"创建目录\"\u003e\u003c/a\u003e\n### 创建目录\n```C++\nQUpYun *upyun = new QUpYun(BucketName, Operator, Password, parent);\nconnect(upyun, \u0026QUpYun::requestMkdirFinished, [=] (bool success) {\n\t...\n});\n\nupyun-\u003emkdir(dir, autoMkdir);\n```\n    \n##### 参数说明\n* `dir`：待创建的目录结构。比如`/dir1/dir2/dir3/`。\n* `autoMkdir`：可选的`boolean`类型参数，表示当不存在父级目录时是否自动创建父级目录（只支持自动创建10级以内的父级目录）。\n\n##### 其他说明\n* 待创建的目录路径必须以斜杠 `/` 结尾。\n* 创建目录操作可在[上传文件](#上传文件)时一并完成，功能是相同的。\n* 若空间相同目录下已经存在同名的文件，则将返回`不允许创建目录`的错误。\n* 使用`requestError(QNetworkReply::NetworkError, const QString \u0026)`信号处理错误。\n\n\u003ca name=\"删除目录\"\u003e\u003c/a\u003e\n### 删除目录\n```C++\nQUpYun *upyun = new QUpYun(BucketName, Operator, Password, parent);\nconnect(upyun, \u0026QUpYun::requestRmdirFinished, [=] (bool success) {\n\t...\n});\n\nupyun-\u003ermdir(dir);\n```\n\n##### 参数说明\n* `dir`：待删除的目录结构。比如`/dir1/dir2/dir3/`。\n\n##### 其他说明\n* 该操作只能删除单级目录，不能一次性同时删除多级目录，比如当存在`/dir1/dir2/dir3/`目录时，不能试图只传递`/dir1/`来删除所有目录。\n* 若待删除的目录`dir`下还存在任何文件或子目录，将返回`不允许删除`的错误。比如当存在`/dir1/dir2/dir3/`目录时，将无法删除`/dir1/dir2/`目录。\n* 使用`requestError(QNetworkReply::NetworkError, const QString \u0026)`信号处理错误。\n\n\n\u003ca name=\"获取目录文件列表\"\u003e\u003c/a\u003e\n### 获取目录文件列表\n```C++\nQUpYun *upyun = new QUpYun(BucketName, Operator, Password, parent);\nconnect(upyun, \u0026QUpYun::requestLsFinished, [=] (const QList\u003cItemInfo\u003e \u0026itemInfos) {\n\t...\n});\n\nupyun-\u003els(dir);\n```\n`ItemInfo`可以获得以下信息：\n* **QString name**：文件名字\n* **bool isFolder**：是否目录\n* **qulonglong size**：文件大小\n* **QDateTime date**：文件时间\n\n##### 参数说明\n* `dir`：待查询的目录结构。比如`/dir1/`。\n\n##### 其他说明\n* 若`dir`目录不存在任何内容时，将返回空列表。\n* 若`dir`目录不存在时，则将返回`不存在目录`的错误。\n* 使用`requestError(QNetworkReply::NetworkError, const QString \u0026)`信号处理错误。\n\n\u003ca name=\"获取空间使用量情况\"\u003e\u003c/a\u003e\n### 获取空间使用量情况\n```C++\nQUpYun *upyun = new QUpYun(BucketName, Operator, Password, parent);\nconnect(upyun, \u0026QUpYun::requestBucketUsageFinished, [=] (qulonglong usage) {\n\t...\n});\n\nupyun-\u003ebucketUsage();\n```\n\n##### 其他说明\n* 使用量的单位为 `byte`，比如`1M`的使用量将以`1048576`这样的数字返回。\n* 使用`requestError(QNetworkReply::NetworkError, const QString \u0026)`信号处理错误。\n\n\n\u003ca name=\"图片处理接口\"\u003e\u003c/a\u003e\n## 图片处理接口\n对于图片的自定义处理，又拍云存储支持以下两种方式：\n\n1. [自定义版本](http://wiki.upyun.com/index.php?title=如何使用自定义缩略图)方式\n2. 上传图片时传递图片处理参数\n\n虽然两种方式都能够达到图片处理的效果，但存在以下区别：\n\n| 区别点 |  自定义版本方式  |  参数处理方式  | \n| ------------ | ---------- | ---------- |\n| 是否保留原图 | 是，各个缩略图都在这个原图的基础上制作 | 否，只保留处理后的图片，若再使用缩略图版本号的方式来访问（这种方法是可行的），则将在处理后的图片基础上制作 |\n| 空间使用量 | 以原图的大小计算使用量，后续各个版本的缩略图都不会计算在用户的空间使用量中 | 以处理后的图片大小计算使用量，大小视具体的处理参数而定 |\n| 灵活性 | 可通过修改自定义版本的参数来满足变化的需求，参数修改后若没有自动刷新缓存，则可以[手动强制刷新](https://www.upyun.com/purge.php)来确保新参数生效 | 只能调整代码中的处理参数，且原先保存的图片无法自动更新 |\n\n我们更推荐大家使用自定义版本的方式对图片进行处理，但您可以根据自己业务的使用场景来选用合适的方式。\n\n以下内容只是介绍传递图片处理参数的方法。\n\n\u003ca name=\"缩略图\"\u003e\u003c/a\u003e\n### 缩略图\n```C++\nQUpYun *upyun = new QUpYun(BucketName, Operator, Password, parent);\n\n// 设置缩略图的参数\nQUpYun::RequestParams params;\n\n// 设置缩略图类型，必须搭配缩略图参数值（X_GMKERL_VALUE）使用，否则无效\nparams.insert(QUpYun::extraParamHeader(QUpYun::X_GMKERL_TYPE), QUpYun::extraParamHeader(QUpYun::FIX_BOTH));\n\n// 设置缩略图参数值，必须搭配缩略图类型（X_GMKERL_TYPE）使用，否则无效\nparams.insert(QUpYun::extraParamHeader(QUpYun::X_GMKERL_VALUE), QVariant(\"150x150\"));\n\n// 设置缩略图的质量，默认 95\nparams.insert(QUpYun::extraParamHeader(QUpYun::X_GMKERL_QUALITY), QVariant(\"95\"));\n\nconnect(upyun, \u0026QUpYun::requestUploadFinished, [=] (bool success, const PicInfo \u0026pi) {\n\t...\n});\n\nupyun-\u003euploadFile(savePath,\n                  file,\n\t\t\t\t  autoMkdir,\n\t\t\t\t  appendFileMD5,\n\t\t\t\t  secret,\n\t\t\t\t  params);\n```\n\n##### 参数说明\n* `savePath`：上传到的又拍云存储的具体地址。\n  * 比如`/dir/sample.jpg`表示以`sample.jpg`为文件名保存到`/dir`目录下；\n  * 若保存路径为`/sample.jpg`，则表示保存到根目录下；\n  * **注意`savePath`必须以`/`开始**，下同。\n* 第二个参数可以是`QString`或`QFile *`类型，即需要上传的文件路径或文件本身。\n* `autoMkdir`：可选的`bool`类型参数，表示当不存在父级目录时是否自动创建父级目录（只支持自动创建10级以内的父级目录）。\n* `appendFileMD5`：可选的`bool`类型参数，表示是否需要附加文件的MD5校验值。如果设置了该参数，上传时会附加被上传文件的MD5校验值。若又拍云服务器计算而得的文件MD5值与此不同，则服务器返回`406 Not Acceptable`错误。对于需要确保上传文件的完整性要求的业务，可以设置该参数。\n* `fileSecret`：可选的`QString`类型参数，表示是否添加文件访问密钥。该访问密钥仅支持图片空间。图片类空间若设置过[缩略图版本号](http://wiki.upyun.com/index.php?title=如何创建自定义缩略图)，即可使用原图保护功能（**文件类空间无效**）。如果设置了该参数，上传时会附加文件访问密钥。待文件保存成功后，将无法根据`http://空间名.b0.upaiyun.com/savePath`直接访问上传的文件，而是需要在URL后面加上`缩略图间隔标志符+密钥`进行访问。例如，[缩略图间隔标志符](http://wiki.upyun.com/index.php?title=如何使用自定义缩略图)为`!`，密钥为`abc`，上传的文件路径为`/dir/sample.jpg`，那么该图片的对外访问地址为: `http://空间名.b0.upaiyun.com/dir/sample.jpg!abc`。**注意，原图保护密钥若与[缩略图版本号](http://wiki.upyun.com/index.php?title=如何创建自定义缩略图)名称相同，则在对外访问时将被视为是缩略图功能，而原图将无法访问，请慎重使用。**\n* `params`：自定义组合的图片处理参数，现提供的参数有：\n  * QUpYun::X_GMKERL_THUMBNAIL：自定义缩略图版本号，需要通过[upyun后台](https://www.upyun.com/login.php)来创建和配置；\n  * QUpYun::X_GMKERL_TYPE：缩略图类型，必须搭配缩略图参数值（QUpYun::X_GMKERL_VALUE）使用，否则无效；\n  * QUpYun::X_GMKERL_VALUE：缩略图参数值，必须搭配缩略图类型（QUpYun::X_GMKERL_TYPE）使用，否则无效；\n  * QUpYun::X_GMKERL_QUALITY：缩略图的质量，默认 95；\n  * QUpYun::X_GMKERL_UNSHARP：缩略图的锐化，默认锐化（true）；\n  * QUpYun::X_GMKERL_CROP：[图片裁剪](#图片裁剪)；\n  * QUpYun::X_GMKERL_ROTATE：[图片旋转](#图片旋转)；\n  * 所有提供的预定义参数都必须使用QUpYun::extraParamHeader函数处理。\n\n##### 其他说明\n* 图片处理参数的具体使用方法，请参考[标准API上传文件](http://wiki.upyun.com/index.php?title=标准API上传文件)。\n* 缩略图功能只能处理图片文件；若上传非图片文件且传递了图片处理参数时，将返回`不是图片`的错误。\n* 使用`requestError(QNetworkReply::NetworkError, const QString \u0026)`信号处理错误。\n\n\n\u003ca name=\"图片裁剪\"\u003e\u003c/a\u003e\n### 图片裁剪\n```C++\nQUpYun *upyun = new QUpYun(BucketName, Operator, Password, parent);\n\n// 设置缩略图的参数\nQUpYun::RequestParams params;\n\n// 设置图片裁剪，参数格式：x,y,width,height\nparams.insert(QUpYun::extraParamHeader(QUpYun::X_GMKERL_CROP), QVariant(\"0,0,100,100\"));\n\nconnect(upyun, \u0026QUpYun::requestUploadFinished, [=] (bool success, const PicInfo \u0026pi) {\n\t...\n});\n\nupyun-\u003euploadFile(savePath,\n                  file,\n\t\t\t\t  autoMkdir,\n\t\t\t\t  appendFileMD5,\n\t\t\t\t  secret,\n\t\t\t\t  params);\n```\n\n##### 参数说明\n* `savePath`：要保存到又拍云存储的具体地址。\n* 第二个参数可以是`QString`或`QFile *`类型，即需要上传的文件路径或文件本身。\n* `autoMkdir`：可选的`bool`类型参数，表示当不存在父级目录时是否自动创建父级目录（只支持自动创建10级以内的父级目录）。\n* `appendFileMD5`：可选的`bool`类型参数，表示是否需要附加文件的MD5校验值。\n* `fileSecret`：可选的`QString`类型参数，表示是否添加文件访问密钥。\n* `params`：自定义组合的图片处理参数。\n\n##### 其他说明\n* 参数格式暂时只支持：`x,y,width,height`。比如`0,0,100,100`表示从左上角顶点裁剪`100px × 100px`大小的图片\n* 具体可参考[图片裁剪](http://wiki.upyun.com/index.php?title=图片裁剪)\n\n\n\u003ca name=\"图片旋转\"\u003e\u003c/a\u003e\n### 图片旋转\n```C++\nQUpYun *upyun = new QUpYun(BucketName, Operator, Password, parent);\n\n// 设置缩略图的参数\nQUpYun::RequestParams params;\n\n// 设置图片旋转：只接受\"auto\"，\"90\"，\"180\"，\"270\"四种参数\nparams.insert(QUpYun::extraParamHeader(QUpYun::X_GMKERL_ROTATE), QUpYun::extraParamHeader(QUpYun::VALUE_ROTATE_90));\n\nconnect(upyun, \u0026QUpYun::requestUploadFinished, [=] (bool success, const PicInfo \u0026pi) {\n\t...\n});\n\nupyun-\u003euploadFile(savePath,\n                  file,\n\t\t\t\t  autoMkdir,\n\t\t\t\t  appendFileMD5,\n\t\t\t\t  secret,\n\t\t\t\t  params);\n```\n\n##### 参数说明\n* `savePath`：要保存到又拍云存储的具体地址。\n* 第二个参数可以是`QString`或`QFile *`类型，即需要上传的文件路径或文件本身。\n* `autoMkdir`：可选的`bool`类型参数，表示当不存在父级目录时是否自动创建父级目录（只支持自动创建10级以内的父级目录）。\n* `appendFileMD5`：可选的`bool`类型参数，表示是否需要附加文件的MD5校验值。\n* `fileSecret`：可选的`QString`类型参数，表示是否添加文件访问密钥。\n* `params`：自定义组合的图片处理参数。\n\n##### 其他说明\n* 暂时只接受\"auto\"，\"90\"，\"180\"，\"270\"四种参数，其中`auto`处理时需要图片包含`EXIF`信息\n* 具体可参考[图片旋转](http://wiki.upyun.com/index.php?title=图片旋转)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevbean%2Fqupyun","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevbean%2Fqupyun","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevbean%2Fqupyun/lists"}