【问题标题】:How to upload file to OneDrive through console app?如何通过控制台应用程序将文件上传到 OneDrive?
【发布时间】:2014-09-03 09:01:54
【问题描述】:

我正在尝试从控制台应用程序中将文件上传到 OneDrive。在深入了解谷歌后,我找到了Live SDK,但我找不到任何使用Live SDK 逐步演示文件上传的文章。有没有什么好的资源来解释如何做到这一点?谢谢。

【问题讨论】:

  • 我尝试使用SkyDrive Api,但它根本没有用。它给出了奇怪的例外。我已经通过一些代码 sn-ps 演示了如何使用 Live SDK 上传文件,但这些代码似乎适用于 Windows Phone 而不适用于控制台应用程序,因为这些代码中没有用户名和密码。

标签: c# file-upload console-application onedrive


【解决方案1】:

LiveSDK 有许多示例和模板代码托管在 Github,https://github.com/liveservices/LiveSDK-for-Windows

要查看上传失败的示例,您可以浏览位于 https://github.com/liveservices/LiveSDK-for-Windows/blob/master/src/Desktop/Samples/ApiExplorer/MainForm.cs#L259 的示例应用程序

这是来自 ApiExplorer 示例应用程序的 sn-p:

OpenFileDialog dialog = new OpenFileDialog(); 
Stream stream = null; 
dialog.RestoreDirectory = true; 


if (dialog.ShowDialog() != DialogResult.OK) 
{ 
    throw new InvalidOperationException("No file is picked to upload."); 
} 
try 
{ 
    if ((stream = dialog.OpenFile()) == null) 
    { 
        throw new Exception("Unable to open the file selected to upload."); 
    }
    using (stream) 
    { 
        return await this.liveConnectClient.UploadAsync(path, dialog.SafeFileName, stream, OverwriteOption.DoNotOverwrite); 
    } 
} 
catch (Exception ex) 
{ 
    throw ex; 
}

【讨论】:

    【解决方案2】:

    如果您想完全避免用户交互,并且仍要在控制台应用程序中使用 onedrive api,则必须实现自定义逻辑。

    首先您需要将 Main 方法标记为 [STAThread](单线程单元模块):

    [STAThread]
    static void Main(string[] args)     
    {
     //...
    }
    

    然后在运行时创建 WebBrowser 控件(您将需要 WinForms 参考)。

    DocumentCompleted 事件添加到 WebBrowser,并在其中注入您的 JavaScript 以自动填写登录表单并模拟登录按钮单击,并在同一方法中检查 WebBrowser url 是否是您的 ReturnUrl。如果是则解析授权码,并继续获取访问和刷新令牌。

    setInterval(function(){
        //your code to interact with ui
    }, 1000);
    

    不要忘记放置一些代码拦截器,例如:

    while (!_autoLoginCompleted)
    {
        Application.DoEvents();
        Thread.Sleep(100);
    }
    

    使用适当的参数(clientId、returnUrl)导航到 https://login.microsoftonline.com/common/oauth2/authorize 以触发 DocumentCompleted 事件。

    之后,您可以存储这些令牌并在以后使用它们,并定期刷新它们。

    您可能还需要抑制 JS 异常。

    顺便说一句,一件有趣的事情是他们的所有代码示例,如果您使用的是本机(控制台)应用程序,他们并没有说您不需要指定客户端密码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-05
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多