Как писать и читать файлы из .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;

Получает место, где могут храниться данные приложения.

Другие вопросы по тегам