Как писать и читать файлы из .NET MAUI Blazor?
Я пытаюсь написать аудио - файл в .NET MAUI Blazor на Windows, так что я могу играть с помощью HTML - элемент аудио через https://0.0.0.0/.. . или такая ссылка.
Как я могу получить путь к локальному хранилищу приложения, в который я могу писать, который указывает на этот URL-адрес?
2 ответа
Теоретически предлагается использовать AppDataDirectory и/или CacheDirectory приложения MAUI, как указано в официальной документации .
На практике существует проблема: к этим папкам невозможно получить прямой доступ со стороны HTML-элементов на странице Razor.
Я собираюсь привести пример со ссылкой на изображения , но то же самое касается и аудиофайлов .
Единственный способ, который я нашел для доступа к файлам, хранящимся в этих папках, из элементов HTML, - это прочитать их промежуточным кодом и использовать их как Base64, например, см. , который предлагает переопределить метод для выполнения чтение и преобразование при первой загрузке изображения.
Проблемы с этим решением :
- это медленно
- вам нужно справиться, когда чтение/
следует позвонить . Это может испортить такие вещи, как виртуализация : переопределения может быть недостаточно.
Например, предположим, что у вас есть длинный список больших изображений, которые вы хотите показать. Вы разрабатываете компонент, в котором хотите параметризовать, какое изображение (или аудиофайл, в вашем случае) должно быть загружено. Вы захотите выполнить загрузку каждого изображения только в том случае, если оно находится в поле зрения: вы захотите использовать виртуализацию или аналогичный метод.
Однако если вы используете виртуализацию, каждый компонент может использоваться повторно (например, при прокрутке вверх и вниз).
Что касается этот ответ при загрузке изображения, хранящегося в CacheDirectoryпримера из того же ответа (то же самое и для аудиофайла), нам нужно изменить код, например:
@if (imageSource is not null)
{
<div>
<img src="@imageSource" width="200" height="200" />
</div>
}
@code {
[Parameter]
public string ImageFileName { get; set; }
private string imageFileName;
// This will store the Base64 read image.
private string imageSource;
protected override void OnInitialized()
{
// Store the parameter value in a private variable.
imageFileName = ImageFileName;
// Perform the first load.
var newFile = Path.Combine(FileSystem.CacheDirectory, imageFileName);
var imageBytes = File.ReadAllBytes(newFile);
imageSource = Convert.ToBase64String(imageBytes);
imageSource = string.Format("data:image/png;base64,{0}", imageSource);
}
protected override void OnParametersSet()
{
if (ImageFileName == imageFileName)
{
// we don't need to do anything, the component is
// reusing the same image with which it was first initialized.
return;
}
// If we are here, the Virtualization has reused an existing
// instance of this component but set a different parameter value.
// Call the initialization again. This will load the right image.
OnInitialized();
}
}
Я все еще активно ищу лучшее решение. Пожалуйста, оставьте комментарий или другой ответ, если он у вас есть! Мне бы очень хотелось просто указать правильное имя файла в источнике изображения! Это фактически устранит необходимость во всем этом коде!
Вот ответ: Документация .NET MAUI о хранилище
Вы можете использовать статическое свойство AppDataDirectory класса FileSystem :
string path = FileSystem.AppDataDirectory;
Получает место, где могут храниться данные приложения.