Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ошибка конвертирования в Base64  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Всем привет!

Пытаюсь получить из binary значения текст в кодировке Base64.
Для этого использую нагугленную функцию:
ALTER FUNCTION [dbo].[fnBinaryBase64Encode] ( @Input varbinary(max) )
RETURNS nVARCHAR(MAX)
BEGIN

DECLARE @EncodedOutput nVARCHAR(MAX)
SET @EncodedOutput = CAST(N'' AS xml).value('xs:base64Binary(sql:variable("@input"))', 'nvarchar(max)') 
RETURN @EncodedOutput

END

Но столкнулся с проблемой - эта функция не всегда верно конвертирует. Т.е. обычный TXT файл или DOCX - без проблем, а вот PDF или AVI уже ошибочно.
Не могу понять в чем проблема... Гугл и поиск по форуму не помогли.
Надеюсь на Вашу мудрость :)

В аттаче скрипт для тестового запуска.
Спасибо!

З.Ы. MS SQL 2012
3 апр 14, 19:37    [15829452]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка конвертирования в Base64  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Так же прилагаю тестовый PDF

К сообщению приложен файл (Hello world.pdf - 82Kb) cкачать
3 апр 14, 19:38    [15829456]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка конвертирования в Base64  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Извиняюсь, но в первый раз не приаттачилось из за размера. Не обратил внимания..
Сжал в архив и приложил DOCX файл для примера, вместе с скриптом.

К сообщению приложен файл (script.zip - 99Kb) cкачать
3 апр 14, 19:40    [15829468]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка конвертирования в Base64  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
+ Код функций, на всякий, не принципиально
CREATE FUNCTION [dbo].[fnBinaryBase64Encode] (
	@Input	VarBinary(max)
) RETURNS VarChar(max) BEGIN
	RETURN Convert(XML,N'').value('sql:variable("@input")','VarChar(max)')
END
GO
CREATE FUNCTION [dbo].[fnBinaryBase64Decode] (
	@Input	VarChar(max)
) RETURNS VarBinary(max) BEGIN
	RETURN Convert(XML,N'').value('sql:variable("@input")','VarBinary(max)')
END
GO
Вы запутались в 3х соснах.
whitebeast
полученный текст в Base64 из http://www.motobit.com/util/base64-decoder-encoder.asp
JVBERi0xLjU ...
Гоните, сохранил бинари, что в скрипте, как файл и пошёл на указаный сайт и он мне выдал:
AlUERGLTEu ...
Т.е. тоже самое что и функция.

Приложенный в архиве "Hello world.docx" имеет другие данные, чем в скрипте, так что не с чем сравнивать.
3 апр 14, 21:07    [15829743]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка конвертирования в Base64  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Во-первых мне нужно только кодирование. Декодирование не нужно.
Во-вторых, покажите мне принципиальную разницу между приведенными Вами функциями и приведенной мной?

А вы бы попробовали не извращаться с сохранением неправильного бинари, а сразу загрузить на сайт PDF.
И будет видна разница. Вы кстати пробовали открывать полученный Вами файл? у меня ощущение, что будет ошибка.

Уточню: бинарник выдает таблица FileTable из MS SQL 2012, поле file_stream.
Возможно проблема в этом, возможно в кодировке, возможно еще в чем-то.
Я хотел бы услышать не "гоните, бла-бла-бла" а нормально поставленный ответ - "ты не прав тут и тут, гугли это и это"
4 апр 14, 11:58    [15832120]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка конвертирования в Base64  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Попробовал сделать CLR функцию. Получил все тот же кривой Base64.
Все больше подозреваю проблему с неверными данными из таблицы FileTable
4 апр 14, 12:17    [15832265]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка конвертирования в Base64  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
Вы же понимаете, что у нескольких миллионов пользователей, как минимум, конвертация в XML работает без ошибок.
4 апр 14, 12:32    [15832386]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка конвертирования в Base64  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Понимаю, поэтому и не виню функцию :) Мне неясно, почему бинарник для Doc и Txt нормально кодируется, а Pdf - уже нет.
4 апр 14, 13:14    [15832686]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка конвертирования в Base64  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Проблема была в доступе. В целевой БД было наворочено много политик и правил. Создал функцию в соседней базе, и все заработало верно.

Всем спасибо.
4 апр 14, 18:14    [15834601]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка конвертирования в Base64  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
+ whitebeast
whitebeast
Во-первых мне нужно только кодирование. Декодирование не нужно.
Проверяется любой пук, включая идентичность конверторов, получающих бинарно идентичные данные.
Не доверять своим рукам и глазам - это профессиональный навык.
whitebeast
Во-вторых, покажите мне принципиальную разницу между приведенными Вами функциями и приведенной мной?
Излишние вещи признак ... ну вы поняли. Делать мне нечего. Будет очередной срач, даю 99%.
1. Дьявол в деталях
2. Умный всегда найдёт выход из безвыходной ситуации. Мудрый никогда в неё не попадёт.
whitebeast
А вы бы попробовали не извращаться с сохранением неправильного бинари, а сразу загрузить на сайт PDF.
Вы кстати пробовали открывать полученный Вами файл? у меня ощущение, что будет ошибка.
Мне нужно проверять что вы неправильно бинари в скуль загрузили? Тема про функцию а не про кривые руки.
Я проверил очень много чего, но вердикт один.
whitebeast
возможно в кодировке
FacePalm.jpg
Кто-то любит гадать, а кто-то не просто знает, а понимает суть вещей.
whitebeast
нормально поставленный ответ
Согласен, кривые руки это не точно, это более глубокое отношение, но я почему-то уверен что в психологии вы то же не мастер.
whitebeast
Проблема была в доступе.
Ага-ага, именно в этом.
4 апр 14, 22:50    [15835612]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить