UWP - 将MediaFile转换为StorageFile

时间:2016-09-28 12:01:30

标签: image win-universal-app uwp converter windows-10-universal

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

原因是我得到了一个MediaFile我想通过路径上传到服务器,但是在UWP中你必须使用StorageFiles而不是文件路径,否则UWP不知道user拥有此文件的权限,只是拒绝访问。所以我想将MediaFile转换为StorageFile,以便能够在用户的临时文件夹中创建该文件的副本。可以通过文件路径访问此文件夹中的文件。

这就是我尝试过的:

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

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

sendFileMessage()是一个来自Interface的方法,所以参数必须是一个字符串,我无法改变它。最初这个字符串应该是路径,所以这是一个廉价的解决方法,但我认为这是合法的。

在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 个答案:

答案 0 :(得分:1)

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

对于UWP应用,您可以在便携式项目中创建一个界面ISaveAndLoad,如下所示:

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

    Task<string> LoadImage(string filename);
}

然后在你的UWP应用程序中创建一个类继承并实现这个ISaveAndLoad接口,如下所示:

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