locked
Открытие локальных файлов в WebView RRS feed

  • Вопрос

  • Данный вопрос я уже задавал на этом форуме, но возможно из-за неполного пояснения проблемы меня не правильно поняли и ответа я не получил.

    Нужно открыть в WebView сохранённый ранее файл из интернета, сохраняю так:

            private async void DownloadClick()
            {
                var uri = new Uri(photomedium); //адрес файла в интернете
                var downloader = new BackgroundDownloader();
                StorageFile file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync("image.jpg",
                    CreationCollisionOption.ReplaceExisting);
                sampleFile = await ApplicationData.Current.LocalFolder.GetFileAsync("image.jpg");
                DownloadOperation download = downloader.CreateDownload(uri, file); //Сохраняю в локальную папку
                await StartDownloadAsync(download);
            }

    Выше был указан только небольшой отрезок кода для пояснения проблемы. 

    Открываю в WebView согласно спецификации ( http://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.applicationdata.localfolder ): 

                    string code = "<img src='ms-appdata:///local/image.jpeg' /> ";
                    WebView.NavigateToString(code);

    Не работает!!! Буду рад если поможете решить проблему.

    P.S.1 Не внушать, что ms-appx-web:/// работает в данном случае.

    P.S.2 Kirill Bessonov и LXGDARK , приношу извинения.


    6 апреля 2013 г. 16:32

Ответы

  • Если это оффлайн приложение, зачем тогда использовать WebView?

    Есть еще такой вариант Local HTML Resources - решение экзотическое, но оно реально работает.

    Создаете шаблон своего html-файла, добавляете его в проект (все как в примере по ссылке).

    Загруженные картинки сохраняете в ApplicationData.Current.LocalFolder:

            protected override async void OnNavigatedTo(NavigationEventArgs e)
            {
                var source = new Uri("http://social.microsoft.com/profile/u/avatar.jpg?displayname=kirill+bessonov&size=extralarge&version=33396107-23f6-4b3e-b97f-984f393a0728");
                StorageFile destinationFile;
                try
                {
                    destinationFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("logo.jpeg", CreationCollisionOption.ReplaceExisting);
                }
                catch (FileNotFoundException ex)
                {
                    return;
                }
                var downloader = new BackgroundDownloader();
                var download = downloader.CreateDownload(source, destinationFile);
                await download.StartAsync();
            }
    


    Далее в классе HttpService.cs я изменил метод WriteResponseAsync:

    ...
        // read the local data.
        StorageFolder localFolder = contentType.Equals("image/jpeg") ? ApplicationData.Current.LocalFolder : Windows.ApplicationModel.Package.Current.InstalledLocation;
    
        var requestedFile = contentType.Equals("image/jpeg") ? await localFolder.GetFileAsync("logo.jpeg") : await localFolder.GetFileAsync("Data" + resourceName.Replace('/', '\\'));
    ...

    Html-файл изменил так:

    ...
    <img src="img/logo.jpeg"/>
    ...

    В результате картинка, которая была загружена ранее в методе OnNavigateTo отобразилась в WebView.

    • Помечено в качестве ответа Anton Nikishin 8 апреля 2013 г. 11:31
    7 апреля 2013 г. 19:51

Все ответы

  • Если вопрос не был решен, то нужно было написать в предыдущей теме, что бы его не закрывали, а вы просто начали уходить от темы.

    Вот простой вопрос - что такое photomedium и какой конкретно путь там указан? Не выходит ли так что там одно а в строке

    ms-appdata:///local/image.jpeg

    совершенно другое. Далее - как вы получаете этот путь photomedium? Просто прописываете ручками, или открываете через средства выбора файлов?


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    6 апреля 2013 г. 19:19
  • photomedium - это  url адрес картинки, полученный в ответ от запроса к API одного из сайтов (на сайте говориться, что этот параметр всегда возвращает адрес картинки пользователя с расширением JPG), даю 100% гарантию того, что картинка, сохранённая в результате загрузки, соответствует данной, она прекрасно открывается в grid'е если указать адрес ms-appdata:///local/image.jpg

    P.S. Извиняюсь, строка по которой переходит WebView следующая: <img src='ms-appdata:///local/image.jpg' /> (расширение jpeg вместо jpg осталось после некоторых опытов с кодом, но это не решает проблему)


    • Помечено в качестве ответа Anton Nikishin 6 апреля 2013 г. 19:46
    • Снята пометка об ответе Anton Nikishin 6 апреля 2013 г. 19:46
    • Изменено Anton Nikishin 6 апреля 2013 г. 19:46
    6 апреля 2013 г. 19:45
  • Антон, я так понимаю, что если вы используете WebView и качаете изображение из web'а, то приложение должно иметь доступ к интернету. В таком случае нельзя ли просто сделать следующим образом (к примеру):

        var photomedium = String.Format("<img src='{0}'/>", "http://limg.imgsmail.ru/s/images/logo/logo_wide.v2.png");
        webView.NavigateToString(photomedium);
    

    То есть не совсем понятно, зачем вы загружаете изображение на компьютер через Url, если WebView может отобразить это же изображение  по тому же Url без всяких дополнительных загрузок? Если вы пытаетесь таким образом кэшировать данные - то есть ли смысл, если вашему приложению все равно требуется интернет?

    P.S. С удовольствием помогу чем смогу... Только без эмоций, плиз.

    6 апреля 2013 г. 22:12
  • Это оффлайн приложение, которое без подключения к интернету должно выводить данные, сохранённые при последнем подключении, это могут быть музыка, видео, фото, поэтому смысл в моих действиях есть.
    7 апреля 2013 г. 7:27
  • Если это оффлайн приложение, зачем тогда использовать WebView?

    Есть еще такой вариант Local HTML Resources - решение экзотическое, но оно реально работает.

    Создаете шаблон своего html-файла, добавляете его в проект (все как в примере по ссылке).

    Загруженные картинки сохраняете в ApplicationData.Current.LocalFolder:

            protected override async void OnNavigatedTo(NavigationEventArgs e)
            {
                var source = new Uri("http://social.microsoft.com/profile/u/avatar.jpg?displayname=kirill+bessonov&size=extralarge&version=33396107-23f6-4b3e-b97f-984f393a0728");
                StorageFile destinationFile;
                try
                {
                    destinationFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("logo.jpeg", CreationCollisionOption.ReplaceExisting);
                }
                catch (FileNotFoundException ex)
                {
                    return;
                }
                var downloader = new BackgroundDownloader();
                var download = downloader.CreateDownload(source, destinationFile);
                await download.StartAsync();
            }
    


    Далее в классе HttpService.cs я изменил метод WriteResponseAsync:

    ...
        // read the local data.
        StorageFolder localFolder = contentType.Equals("image/jpeg") ? ApplicationData.Current.LocalFolder : Windows.ApplicationModel.Package.Current.InstalledLocation;
    
        var requestedFile = contentType.Equals("image/jpeg") ? await localFolder.GetFileAsync("logo.jpeg") : await localFolder.GetFileAsync("Data" + resourceName.Replace('/', '\\'));
    ...

    Html-файл изменил так:

    ...
    <img src="img/logo.jpeg"/>
    ...

    В результате картинка, которая была загружена ранее в методе OnNavigateTo отобразилась в WebView.

    • Помечено в качестве ответа Anton Nikishin 8 апреля 2013 г. 11:31
    7 апреля 2013 г. 19:51
  • Нет слов! Мне очень нравиться! Кирилл, спасибо!

    P.S. Решил сделать так:

                        var localFolder = ApplicationData.Current.LocalFolder;
                    
                        var requestedFile = await localFolder.GetFileAsync(resourceName.Replace('/', '\\'));
    И обращаться через localhost:8080
    8 апреля 2013 г. 11:31
  • Пожалуйста ))
    8 апреля 2013 г. 11:33