2016-09-28 12 views
0

タイプPlugin.Media.Abstractions.MediaFileからWindows.Storage.StorageFileに変換する必要があります。UWP - MediaFileをStorageFileに変換する

理由は私がパス経由でサーバーにアップロードしたいのですが、UWPではファイルパスではなくStorageFilesで作業する必要があります。それ以外のUWPではユーザーがこのファイルのアクセス許可を拒否し、アクセスを拒否します。だから私はMediaFileをStorageFileに変換して、ユーザーの一時フォルダにファイルのコピーを作成したいと思っています。このフォルダのファイルは、ファイルのパスからアクセスできます。私が試したものだ

:パラメータは文字列である必要があり、私はそれを変更することはできませんので

Stream stream = _mediaFile.GetStream(); 
StreamReader reader = new StreamReader(stream, Encoding.UTF8); 
string streamText = reader.ReadToEnd(); 

_websocketManager.sendFileMessage(_selectedChat.chatId, _nachrichttext, streamText); 

sendFileMessage()は、インタフェースからのメソッドです。もともとこの文字列はパスであるはずなので、私の安い解決策ですが、それは達成しようとしていることのための正当なものです。 WebsocketManagerで

が、これは私の方法 sendFileMessage()です:私は、コードにコメントとして、私が見つける必要があり、また

byte[] byteArray = Encoding.UTF8.GetBytes(streamText); 
MemoryStream stream = new MemoryStream(byteArray); 

StorageFolder temporaryFolder = ApplicationData.Current.TemporaryFolder; 

var temporaryFile = await temporaryFolder.CreateFileAsync("temporaryFile", CreationCollisionOption.ReplaceExisting); 

using (var fileStream = File.Create(temporaryFolder.Path + "\\TemporaryFile")) // TODO: How to data type? (.png, .jpg, ...) 
{ 
    stream.Seek(0, SeekOrigin.Begin); 
    stream.CopyTo(fileStream); 
} 

string filePath = temporaryFile.Path; 
string remoteFilePath = null; 
if (!string.IsNullOrEmpty(filePath)) 
{ 
    await StorageFile.GetFileFromPathAsync(filePath); 
    remoteFilePath = await uploadFile(filePath); 
} 
    dataWriter.WriteString(WebsocketRequestFactory.Create(SocketEventsEnm.MESSAGE_OUT, chatId, message, remoteFilePath, TypeEnm.IMAGE)); 
await SendData(dataWriter); 
await temporaryFile.DeleteAsync(); 

どのデータタイプMediaFileた(.PNG、.JPG、など) 。

答えて

1

xamarin公式ドキュメントWorking with Filesを参照してファイルを読み書きすることができます。各プラットフォームでネイティブファイルAPIを使用する必要があります。

public interface ISaveAndLoad 
{ 
    void SaveImage(string filename, Stream filestream); 

    Task<string> LoadImage(string filename); 
} 

は、その後、あなたのUWPアプリでクラスの継承を作成し、このように、この​​インタフェースを実装:

UWPのアプリケーションでは、このように、ポータブルプロジェクト内のインターフェース​​を作成することができます

public class SaveAndLoad_UWP : ISaveAndLoad 
{ 
    public async Task<string> LoadImage(string filename) 
    { 
     StorageFolder local = ApplicationData.Current.LocalFolder; 
     StorageFile file = await local.GetFileAsync(filename); 
     return file.Path; 
    } 

    public async void SaveImage(string filename, Stream filestream) 
    { 
     StorageFolder localFolder = ApplicationData.Current.LocalFolder; 
     StorageFile File = await localFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting); 
     using (var stream = await File.OpenStreamForWriteAsync()) 
     { 
      await filestream.CopyToAsync(stream); 
     } 
    } 
} 

最後に、画像を選択するとMediaFileStorageFileに変換し、次のように一時ファイルのパスを取得できます。

var file = await CrossMedia.Current.PickPhotoAsync(); //pick a file 

if (file == null) 
    return; 
var path = file.Path; 
var filetype = path.Split('.').Last(); //get file type 
var filestream = file.GetStream(); 

DependencyService.Get<ISaveAndLoad>().SaveImage("temp." + filetype, filestream); //save file 

var temppath = DependencyService.Get<ISaveAndLoad>().LoadImage("temp." + filetype); //get temp file's path 
+0

ありがとうございます。私はあなたのコードを少し変更して、それが私の特定の状況のた​​めに働くようにしました。私はSaveImage()が必要なだけで、ファイルのパスを返すことができます。今私のメソッド "sendFileMessage"にこのパスを使用することができます! –

関連する問題