Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.129.210.17] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте. столкнулся с проблемой. Пытаюсь с помощью File API считать файл и передать его в silverlight функцию. Пример чтения файла брал здесь. Так вот проблема в том что если читать .docx файл как readAsBinaryString и readAsText то получаю невалидные данные. Silverlight функция принимает данные как string. Вопрос, как мне передать байтовый массив. Буду очень благодарен за любую помощь.
|
Сообщ.
#2
,
|
|
|
Рекомендую использовать библиотеку для File API: https://github.com/mailru/FileAPI
С ней проще работать. Есть мнение что проблема в HTTP заголовках которые вы отправляете на сервер. Проверьте Content-type. |
Сообщ.
#3
,
|
|
|
Цитата Sunny @ Рекомендую использовать библиотеку для File API: https://github.com/mailru/FileAPI С ней проще работать. Не могу использовать сторонние библиотеки к сожалению. Задачу нужно решить штатными средствами. Наверное выложу код тогда станет понятней. 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; } Код силверлайт функции. /// <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. Буду пробовать наверное с той ссылки которую вы скинули выше брать код кусками. Если конечно выйдет. |
Сообщ.
#4
,
|
|
|
Вопрос решен. Вот поделюсь решением. Поменялась функция readFile
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); } И немного поменялась сильверлайт функция [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()); } } |