На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Чтение файла File API + Silverlight
    Здравствуйте. столкнулся с проблемой. Пытаюсь с помощью File API считать файл и передать его в silverlight функцию. Пример чтения файла брал здесь. Так вот проблема в том что если читать .docx файл как readAsBinaryString и readAsText то получаю невалидные данные. Silverlight функция принимает данные как string. Вопрос, как мне передать байтовый массив. Буду очень благодарен за любую помощь.
      Рекомендую использовать библиотеку для File API: https://github.com/mailru/FileAPI
      С ней проще работать.

      Есть мнение что проблема в HTTP заголовках которые вы отправляете на сервер.
      Проверьте Content-type.
        Цитата Sunny @
        Рекомендую использовать библиотеку для File API: ­https://github.com/mailru/FileAPI
        С ней проще работать.

        Не могу использовать сторонние библиотеки к сожалению. Задачу нужно решить штатными средствами.

        Наверное выложу код тогда станет понятней.
        ExpandedWrap disabled
          if (window.File && window.FileList && window.FileReader)
                          {
                              /************************************
                               * All the File APIs are supported. *
                               * Entire code goes here.           *
                               ************************************/
                              readFile(result);
                          }
                          else
                          {
                              alert('Sorry! youre browser does not support HTML5 File APIs.');
                          }
           
          function readFile(result) {
                      /* Get the reference of the inpout element. */
                      var files = document.getElementById('loadFile').files;
           
                      if (!files.length) {
                          alert('Please select a file!');
                          return;
                      }
           
                      /* Reading the first file selected. You can process other files similarly in loop. */
                      var file = files[0];
           
                      /* Instantiate the File Reader object. */
                      var reader = new FileReader();
           
                      /* onLoad event is fired when the load completes. */
                      reader.onload = function (event) {
                          var extension  = getExt(file.name);
                          slCtl.Content.telerikEditor.LoadDocument(result, event.target.result, extension);
                      };
           
                      /* The readAsText method will read the file's data as a text string. By default the string is decoded as 'UTF-8'. */
                      reader.readAsBinaryString(file);
                  }
           
          function getExt(filename) {
                      var ext = filename.split('.').pop();
                      if (ext == filename) return "";
                      return "." + ext;
                  }


        Код силверлайт функции.
        ExpandedWrap disabled
          /// <summary>
                  ///
                  /// </summary>
                  /// <param name="role">Роль пользователя</param>
                  /// <param name="data">Файл </param>
                  /// <param name="extension">Расширение документа</param>
                  [ScriptableMember]
                  public void LoadDocument(int role, object data, string extension)
                  {
                      _extension = extension;
                      SetParameters(role);
                      try
                      {
                          var result = GetBytes((string)data);//UTF8Encoding.UTF8.GetBytes(data);
                          var formatProvider = DocumentFormatProvidersManager.GetProviderByExtension(extension);
                          radRichTextBox.Document = formatProvider.Import(result);
                      }
                      catch (Exception ex)
                      {
                          MessageBox.Show(ex.ToString());
                      }
                      
                  }
           
                  static byte[] GetBytes(string str)
                  {
                      byte[] bytes = new byte[str.Length * sizeof(char)];
                      System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
                      return bytes;
                  }


        Как сделать чтобы в object data пришел нормальный байтовый массив? Потому что если то что приходит с функций выше для .docx файла, при сохранении в .docx не получаю валидный файл. Буду благодарен за пинки в нужную сторону.

        Цитата Sunny @
        Есть мнение что проблема в HTTP заголовках которые вы отправляете на сервер.
        Проверьте Content-type.

        А как в том коде что я привел проверить вообще Content-type. Если бы я считывал данные как readAsDataURL, то я мог бы сам заполнить Content-type. Но для загрузки файла по url е меня есть другой код. Он рабочий. А вот загрузка файла как массива байт я осилить не могу на File API. Буду пробовать наверное с той ссылки которую вы скинули выше брать код кусками. Если конечно выйдет.
        Сообщение отредактировано: Craft -
          Вопрос решен. Вот поделюсь решением. Поменялась функция readFile
          ExpandedWrap disabled
            function readFile(result) {
                        /* Get the reference of the inpout element. */
                        var files = document.getElementById('loadFile').files;
             
                        if (!files.length) {
                            alert('Please select a file!');
                            return;
                        }
             
                        /* Reading the first file selected. You can process other files similarly in loop. */
                        var file = files[0];
             
                        /* Instantiate the File Reader object. */
                        var reader = new FileReader();
             
                        /* onLoad event is fired when the load completes. */
                        reader.onload = function (event) {
                            var extension = getExt(file.name);
                            var markup = [];
                            var res = event.target.result;
                            for (var n = 0; n < res.length; ++n) {
                                var aByte = res.charCodeAt(n);
                                var byteStr = aByte.toString(16);
                                if (byteStr.length < 2) {
                                    byteStr = "0" + byteStr;
                                }
                                markup.push(byteStr);
                            }
                            slCtl.Content.telerikEditor.LoadDocument(result, markup.join(" "), extension);
                        };
             
                        /* The readAsText method will read the file's data as a text string. By default the string is decoded as 'UTF-8'. */
                        reader.readAsBinaryString(file);
                    }

          И немного поменялась сильверлайт функция
          ExpandedWrap disabled
            [ScriptableMember]
                    public void LoadDocument(int role, string data, string extension)
                    {
                        _extension = extension;
                        SetParameters(role);
                        try
                        {
                            var stringSeparators = new[] { " " };
                            var res = data.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries);
                            var byteOut = new byte[res.Length];
             
                            for (int i = 0; i < res.Length; i++)
                            {
                                byteOut[i] = Convert.ToByte(res[i], 16);
                            }
                            var formatProvider = DocumentFormatProvidersManager.GetProviderByExtension(extension);
                            radRichTextBox.Document = formatProvider.Import(byteOut);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.ToString());
                        }
                        
                    }
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0337 ]   [ 18 queries used ]   [ Generated: 2.05.24, 09:15 GMT ]