【问题标题】:Single C# API to access dropbox, iCloud, SkyDrive, etc.?单个 C# API 访问 Dropbox、iCloud、SkyDrive 等?
【发布时间】:2015-01-07 02:16:41
【问题描述】:

我正在寻找一种方法来从所有各种云存储系统中读取文件,而无需为每个特定的 API 编写代码。有没有办法做到这一点?我们需要的很简单:

  1. 一种获取 FileOpen 对话框的文件夹内容的方法。
  2. 一种读取选定文件的方法。
  3. 可选:一个 FileOpen 对话框,它执行所有工作以显示文件并选择一个。

谢谢 - 戴夫

【问题讨论】:

  • “要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是无关紧要的,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,描述问题以及迄今为止为解决问题所做的工作。”
  • 好的,具体需要重新写一下。
  • 你需要的是 not 非常简单,你需要一个虚拟文件系统(除非你想先将所有文件下载到本地,我想你不会)。请参阅Windows virtual disk for remote web serviceDropbox and its “Folder” like designWriting a user mode filesystem for windows?。一旦你弄清楚了,使用多个 Web 服务并将它们的内容显示为本地文件系统并从中读取文件是微不足道的。
  • @CodeCaster 我同意这并不简单。这就是为什么我要问是否有人知道一些方法可以在不编写特定于每个 API 的代码的情况下获取此信息。
  • 查看kloudless.com(此处为联合创始人)。 Kloudless 为 20 多个不同的云存储供应商提供单一的 REST API,包括 Dropbox、OneDrive、Google Drive 和 Box。您当然可以使用我们的 C# API 来列出文件夹内容,如 here 所示。此处的文档:developers.kloudless.com/docs/…

标签: .net dropbox-api onedrive icloud-api


【解决方案1】:

这个问题有一个解决方案。 point.io 有一个公共 api,它通过 restful api 代理对云和企业存储提供商的访问。它基本上具有您正在寻找的功能。该 api 使开发人员能够将各种存储提供程序视为类型,并为您的应用完成所有繁重的工作。

他们有一个github repo that has C# src code examples

下面是一些调用文件列表的简单 C# 代码:

public async Task<List<FolderContent>> list(String sessionKey, String shareid, String containerid, String path)
{
HttpClient tClient = new HttpClient();
tClient.DefaultRequestHeaders.Add("AUTHORIZATION", sessionKey);
var query = HttpUtility.ParseQueryString(string.Empty);
query["folderid"] = shareid;
query["containerid"] = containerid;
query["path"] = path;
string queryString = query.ToString();
var rTask = await tClient.GetAsync(PointIODemo.MvcApplication.APIUrl + "folders/list.json?" + queryString);
var rContent = rTask.Content.ReadAsStringAsync().Result;
var oResponse = JsonConvert.DeserializeObject<dynamic>(rContent);
if (oResponse["ERROR"] == "1")
{
HttpContext.Current.Response.Redirect("/Home/ErrorTemplate/?errorMessage=" + oResponse["MESSAGE"]);
}
var rawColList = JsonConvert.DeserializeObject<List<dynamic>>(JsonConvert.SerializeObject(oResponse["RESULT"]["COLUMNS"]));
var rawContentList = JsonConvert.DeserializeObject<List<dynamic>>(JsonConvert.SerializeObject(oResponse["RESULT"]["DATA"]));
var fContentList = new List<FolderContent>();
foreach (var item in rawContentList)
{
FolderContent tContent = new FolderContent();
tContent.fileid = item[MvcApplication.getColNum("FILEID", rawColList)];
tContent.filename = item[MvcApplication.getColNum("NAME", rawColList)];
tContent.containerid = item[MvcApplication.getColNum("CONTAINERID", rawColList)];
tContent.remotepath = item[MvcApplication.getColNum("PATH", rawColList)];
tContent.type = item[MvcApplication.getColNum("TYPE", rawColList)];
tContent.size = item[MvcApplication.getColNum("SIZE", rawColList)];
tContent.modified = item[MvcApplication.getColNum("MODIFIED", rawColList)];
fContentList.Add(tContent);
}
return fContentList;
}

【讨论】:

    【解决方案2】:

    您可以将“API v1(核心 API)”用于: 一种获取 FileOpen 对话框的文件夹内容的方法。 一种读取选定文件的方法。 可选:一个 FileOpen 对话框,它完成所有工作以显示文件并选择一个。

    举个简单的例子:从您的 Dropbox 帐户中获取文件和文件夹列表

          //get the files from dropbox account and add it to listbox
    
       private void GetFiles()
        {
            OAuthUtility.GetAsync
            (
            "https://api.dropboxapi.com/1/metadata/auto/",
                new HttpParameterCollection
                {
                   { "path", this.CurrentPath },
                   { "access_token", Properties.Settings.Default.AccessToken }
                },
                callback : GetFiles_Results
            );
        }
    
    
      private void GetFiles_Results(RequestResult result)
        {
            if(this.InvokeRequired)
            { 
            this.Invoke(new Action<RequestResult>(GetFiles_Results), result);
            return;
            }
    
            if (result.StatusCode == 200) //200 OK- Success Codes
            {
                listBox1.Items.Clear();
    
                listBox1.DisplayMember = "path";
    
                foreach (UniValue file in result["contents"])
                {
                    listBox1.Items.Add(file);
    
                }
    
                if(this.CurrentPath != "/")
                {
                    listBox1.Items.Insert(0,UniValue.ParseJson("{path: '..'}"));
                }
            }
            else
            {
                MessageBox.Show("Failed to add file to listbox");
            }
        }
    

    【讨论】:

    • 这似乎专门针对 Dropbox 回答了这个问题,但是 OP 要求一种方法来访问“所有各种云存储系统,而无需为每个特定 API 编写代码”——这只是一个单个云存储系统的具体实现。
    • 那么不为每个特定的API编写代码就不可能访问所有的各种云存储系统.....
    • 您必须使用特定的 API - 获取 FileOpen 对话框的文件夹内容。 - 一种读取所选文件的方法。 - FileOpen 对话框完成所有工作以显示文件并选择一个。
    • 但是您的一个选择是...访问 Dropbox 的本地存储...。安装 Dropbox 的位置...。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 2012-12-24
    相关资源
    最近更新 更多