2016-09-28 105 views
0

我需要从Plugin.Media.Abstractions.MediaFile类型转换为Windows.Storage.StorageFileUWP - 将MediaFile转换为StorageFile

原因是我得到一个MediaFile,我想通过该路径上传到服务器,但在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为(巴纽,JPG格式,等等) 。

回答

1

您可以参考xamarin官方文档Working with Files来读写文件,我们需要在每个平台上使用本地文件API。

对于UWP的应用程序,你可以在便携式项目创建一个接口​​这样的:

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

    Task<string> LoadImage(string filename); 
} 

然后在你的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); 
     } 
    } 
} 

最后,当您选取图片时,您可以将MediaFile转换为StorageFile,并获取临时文件的路径,如下所示:

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”! –

相关问题