一个用于将文档上传到您的Google Docs账户的C++客户端。简介
我叫Michael Haephrati,这是我的第一篇文章。我想写一个小应用程序,它允许将多个文件和文件夹拖放到一个容器中,以便将它们发送到在线存储。这篇文章写于Google推出Google Drive之前,但它仍然可以方便地将多个文件快速上传到您的Google Drive。
本文将介绍如何开发这样一个应用程序,该应用程序将使用免费和付费的Google Docs服务来存储文档和文件在线,允许最终用户拖放文件和整个文件夹,从而将选定的文件备份到预定义的Google Docs账户。
Google Docs允许用户创建和上传文档和文件,进行编辑,并将它们存储在线。该服务是免费的;但是,在使用付费服务时不存在这些限制。
Google Docs账户类型
如在此处所述,免费账户类型在允许上传的文件类型方面存在限制。这些限制适用于以编程方式使用该服务,而不是使用在线界面 docs.google.com。
为了解除一些限制,最终用户应拥有Premier账户。免费账户的用户只能上传HTML、PDF、Word、Excel、PowerPoint、OpenOffice、文本和图像文件。
实现
作为基础,我们开发了一个名为SmartHTTP的类库。
1
2
3
4
5#define HTTP_POST_VERB L"POST" #define HTTP_CONTENT_LENGTH L"Content-Length" #define HTTP_CONTENT_TYPE L"Content-Type" #define HTTP_MIME_BINARY L"application/octet-stream" #define HTTP_MIME_FORM_URL_ENCODED L"application/x-www-form-urlencoded"
通过以下方式连接到Google Docs服务器:
BOOL Connect(LPCTSTR szServerName, INTERNET_PORT nServerPort = INTERNET_DEFAULT_HTTP_PORT);
以及调用:
1
2
3
4
5if (!m_internet.Connect(GOOGLE_LOGIN_SERVER, INTERNET_DEFAULT_HTTPS_PORT)) SetWinInetError(m_internet.GetError()); else { //... here we upload the documents, etc.
Google Docs服务器定义在此:
GOOGLE_LOGIN_SERVER 是 L”www.google.com”
您可能需要注册一个Google账户。Gmail账户即可。如果您已登录,请前往 http://docs.google.com。
基本上,我的应用程序是一个容器,文件和整个文件夹可以拖放到其中,导致其中所有文件(包括子文件夹中的文件)都被发送到Google Docs服务器。当应用程序启动时,容器就会出现。
![]()
![]()
关闭它会将它发送到系统托盘。系统托盘图标用于在运行时显示状态消息。例如,当一个文件被拖到容器中时,它将被添加到队列中,并出现以下消息:
![]()
关于转换为Google Docs格式
Google Docs提供将上传的文档转换为Google Docs格式。这种转换在此处进行了说明。根据我的经验,某些类型的文档在转换后可能会损坏,特别是对从右到左语言(阿拉伯语、希伯来语等)的Word文档。
因此,我添加了一个复选框,允许最终用户决定是否转换。
但在第一个文件可以复制之前,会弹出“设置”对话框,允许最终用户输入Google Docs账户详细信息。此外,还可以设置以下选项:
Google Apps Premier账户 - 允许指示账户类型。 镜像文件夹列表 - 允许添加(或删除)本地文件夹,这些文件夹将在服务器端镜像,保留给定路径下文件和文件夹的结构。 在Google Docs中重新创建文件夹结构 - 设置此选项后,文档将被复制到与本地文件夹同名的文件夹中。 将所有文档上传到Google Docs的根文件夹 - 设置此选项后,文档将被复制到服务器端的根目录。 在Windows启动时启动程序 - 在Windows启动时运行DocsOnline。 ![]()
Premier账户持有者可以复制更多对普通(免费)账户有限制的文件类型。
我直观备份的逻辑我认为应用程序和实用工具应该直观且易于使用。例如,我的应用程序允许拖放文件夹,通过这样做,所有文件以及所有子文件夹中的文件都会被备份,在检查服务器上已有的先前副本之后。我用于此类“直观备份”的逻辑是通过检查每个文件并计算代表其内容的哈希值来完成的。该逻辑解决了以下场景:
1. **不同文件具有相同的名称** - 复制,但自动生成新名称。添加日志条目。
2. **相同的不同名称文件** - 添加日志条目(稍后版本中,我们将把这些文件合并为一个具有单个名称的文件)。
3. **相同的文件具有相同的名称** - 跳过。
鸣谢
由 Chris Maunder 编写的 SystemTraySDK类,在我应用程序中使用,是对Windows系统托盘功能的轻量级封装。它在系统托盘中添加了一个图标,并带有指定的工具提示文本和回调通知值,该值会被发送回父窗口。
许可证
本文以及任何相关的源代码和文件,均根据 The Code Project Open License (CPOL) 许可。
关于作者
Michael N. Haephrati,是一位企业家、发明家和音乐家。Haephrati曾参与过许多项目,包括HarmonySoft,设计了Amiga计算机的首款图形化多语言文字处理器Rashumon。在1995-1996年,他作为合同工在 Apple 公司库比蒂诺工作。在一家研究所工作,开始了在以色列开发信用评分领域的初步工作。他创立了Target Scoring公司,并基于地理统计数据开发了名为ThiS的信用评分系统,参与了VISA CAL、Isracard、Leumi银行和Discount银行(Target Scoring公司是以色列一家大型机构的业务发展副总裁)。
2000 年,他创立了 Target Eye,并开发了第一个名为 Target Eye 的远程 PC 监控系统。
其他项目包括: 数据清洗(作为 DataTune 系统的组成部分,该系统已在许多组织中实施)。
关注 @haephrati
在 Twitter、Google、LinkedIn 上关注我。
文章顶部
附件:[DocsOnlinebyMichaelHaephratiSrc ] [one.zip] [two.zip]