【问题标题】:How to upload a file from IsolatedStorage to SkyDrive?如何将文件从 IsolatedStorage 上传到 SkyDrive?
【发布时间】:2013-07-11 20:51:37
【问题描述】:

我正在尝试将文本文件 myFile.txt 上传到 SkyDrive。下面是代码:

private async void btnUpload_Click( object sender, System.Windows.RoutedEventArgs e )
{
    Client = new LiveConnectClient( _session );
    string filename = "myFile.txt";

    var isolatedstorageFile= await ApplicationData.Current.LocalFolder.CreateFileAsync( filename, CreationCollisionOption.ReplaceExisting );

    using ( StreamWriter writer = new StreamWriter( await isolatedstorageFile.OpenStreamForWriteAsync() ) )
    {
        // convert to string
        var _String = Serialize( "this is a test file" );
        await writer.WriteAsync( _String );
    }

    await Client.BackgroundUploadAsync( FolderID, new Uri( isolatedstorageFile.Path ), OverwriteOption.Overwrite );
}

FolderID 是全局的,其值为:“folder.17ff6230f5f26b89.17FF6230F5F26B89!1533”

问题在于定义BackgroundUploadAsync 的第二个参数。如何解决,即指定“myFile.txt”IsolatedStorage 文件所在的 URI?

谢谢,

【问题讨论】:

    标签: c# windows-phone-8 onedrive live-sdk


    【解决方案1】:

    您在BackgroundUploadAsync 中传递了3 个参数,其中第一个是FolderId,第二个是文件路径,检查documentation first 是错误的,第二个参数只取文件名而不是文件路径,第三个是一是文件流。

    您也可以使用UploadAsync 代替BackgroundUploadAsync

        IsolatedStorageFileStream isfs = isf.OpenFile(FileName, FileMode.Open, FileAccess.Read);
    
        var res = await client.UploadAsync(folderId, FileName, isfs, OverwriteOption.Overwrite);
    

    【讨论】:

    • 他对BackgroundUploadAsync 的调用是正确的,这就是它在Windows Phone 中的做法。问题在于传递给方法的 Uri。
    【解决方案2】:

    使用this link 作为参考。

    您在上传时遇到问题,我猜这是因为您尝试上传不在隔离存储中的共享/传输文件夹中的文件。所以只需在共享/传输中创建文件,然后尝试将文件上传到天空驱动器。

    【讨论】:

      【解决方案3】:

      要使用BackgroundUploadAsync 方法从独立存储上传文件,您需要正确的文件URI。访问存储在隔离存储中的文件的路径是/shared/transfers/。因此,要将 URI 参数传递给方法,请将 /shared/transfers/ 附加到文件名中。这将是有效的 URI。见下文:

      await Client.BackgroundUploadAsync(FolderID, new Uri("/shared/transfers/" + fileName, UriKind.Relative), OverwriteOption.Overwrite );
      

      另一种选择是使用UploadAsync 方法并附加流。

      【讨论】:

        【解决方案4】:

        感谢我得到的所有指点。重写了函数,是这样的:

            private async void btnUpload_Click( object sender, System.Windows.RoutedEventArgs e )
                {
                string filename = "myFile.txt";
        
                StorageFolder folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync( "Shared", CreationCollisionOption.OpenIfExists );
                folder = await folder.CreateFolderAsync( "transfers", CreationCollisionOption.OpenIfExists );
        
                var isolatedstorageFile= await folder.CreateFileAsync( filename, CreationCollisionOption.ReplaceExisting );
                using ( StreamWriter writer = new StreamWriter( await isolatedstorageFile.OpenStreamForWriteAsync() ) )
                    {
                    // convert to string
                    var _String = Serialize( "this is a test file" );
                    await writer.WriteAsync( _String );
                    }
        
                await LiveHelper.Client.BackgroundUploadAsync( FolderID, new Uri( "/shared/transfers/" + filename, UriKind.Relative ), OverwriteOption.Overwrite );
                }
        
        
            private static string Serialize( object objectToSerialize )
                {
                using ( MemoryStream _Stream = new MemoryStream() )
                    {
                    try
                        {
                        var _Serializer = new DataContractJsonSerializer( objectToSerialize.GetType() );
                        _Serializer.WriteObject( _Stream, objectToSerialize );
                        _Stream.Position = 0;
                        StreamReader _Reader = new StreamReader( _Stream );
                        return _Reader.ReadToEnd();
                        }
                    catch ( Exception e )
                        {
                        Debug.WriteLine( "\n******** Serialize:" + e.Message );
                        return string.Empty;
                        }
                    }
                }
        

        文件已上传到正确的 FolderID。

        艾坦

        【讨论】:

          【解决方案5】:

          要将文件上传到 Skydrive,文件应保存在 IsolatedStorage 的“/shared/transfers/”文件夹中。 LiveConnectClient 只能从“/shared/transfers/”上传/下载文件。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-08-20
            • 2013-01-07
            • 1970-01-01
            • 2013-08-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-02
            相关资源
            最近更新 更多