powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Base64 для имён файлов
25 сообщений из 37, страница 1 из 2
Base64 для имён файлов
    #39625125
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно в имени файла хранить некую бизнес информацию - строку. оказалось, что эта информация может содержать всякие хитрые символы, например "/". Это пока не точно, но надо придумывать workaround на всякий случай.

Есть идея использовать Base64.

Как я понял эта кодировка позволяет кодировать бинарные данные при помощи 64 символов:
- Большие и маленькие символы латинского алфавита
- '+' и '/'

Код: java
1.
2.
3.
4.
5.
6.
7.
private static final char[] toBase64 = {
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
            'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
            'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
        };




Для урлов используется немного другой набор символов: вместо '+' и '/' используется '-' и '_'

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 * It's the lookup table for "URL and Filename safe Base64" as specified
         * in Table 2 of the RFC 4648, with the '+' and '/' changed to '-' and
         * '_'. This table is used when BASE64_URL is specified.
         */
        private static final char[] toBase64URL = {
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
            'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
            'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_'
        };



На ntfs длина имени файла ограничена 255 символами(я так понимаю, что расширение сюда входит) и хотелось бы гарантий того, что мы не вылезем за пределы.


По поводу безопасности использования base64 для имён файлов нагуглил следующий топик

https://stackoverflow.com/a/3945743/2674303 Modified Base64 (when /,= and + are replaced) is safe to create names but does not guarantee reverse transformation due to case insensitivity of many file systems and urls.

Base64 is case sensitive, so it will not guarantee 1-to-1 mapping in cases of case insensitive file systems (all Windows files systems, ignoring POSIX subsystem cases). Most urls also case insensitive preventing 1-to-1 mapping.

Объясните мне пожалуйста про что тут идёт речь?
Я не понимаю как тот факт, что ОС не чувствительна к регистру, а Base64 чувствителен мешает в этом случае.



Второй вопрос про длину - я не понимаю как она считается.
нагуглил по этому вопросу Base64 length calculation? :

тут есть какая-то формула:

4*(n/3)

но я не понял как её применять.
автор"14A/".getBytes() = [49, 52, 65, 47]
Получается, что один символ это один байт.

14A/ - 8*4 = 32 бита.


но (Base64.getEncoder().encodeToString("1234".getBytes()) => MTIzNA==

и это получается 8 символов.

(Base64.getEncoder().encodeToString("12345".getBytes()) => MTIzNDU=

тоже 8 символов.

(Base64.getEncoder().encodeToString("123456".getBytes()) => MTIzNDU2

тоже 8 символов

(Base64.getEncoder().encodeToString("1234567".getBytes()) => MTIzNDU2Nw==

а это уже 12 символов

Объясните как это работает, плиз
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625147
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerЕсть идея использовать Base64.
Да. Нужно упаковывать, но подыскать альтернативу Base64.

questionerНа ntfs длина имени файла ограничена 255 символами(я так понимаю, что расширение сюда входит) и хотелось бы гарантий того, что мы не вылезем за пределы.

Каких ещё гарантий? Откуда нам знать сколько информации вы собрались хранить.

questionerОбъясните мне пожалуйста про что тут идёт речь?
Я не понимаю как тот факт, что ОС не чувствительна к регистру, а Base64 чувствителен мешает в этом случае.

Запишешь один файл. Захочешь записать другой, а ОС тебе фигушки крутит. Потому что с её точки зрения имена одинаковые, а Base64 строки - разные. Нужно ещё уникальный ID добавлять.
Ну, и некоторые инструменты могут вдруг имя привести к одному регистру. Хотя, такое редкость.


questionerВторой вопрос про длину - я не понимаю как она считается.

Трындец, ну как можно не понять Base64
https://ru.wikipedia.org/wiki/Base64

questionerтут есть какая-то формула:
4*(n/3)
но я не понял как её применять.

3 байта кодируются 4мя символами. То есть, примерно, +30% к изначальной длине.


А нет идеи писать информацию в метаданные файла? Немного не кросс-платформенно, но всё же.
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625158
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerНужно в имени файла хранить некую бизнес информацию - строку
https://softwareengineering.stackexchange.com/questions/213124/is-it-bad-practice-to-store-metadata-information-in-file-names-better-solutions

Вообще Base64 звучит избыточно. В зависимости от содержания строки URL Encoding может оказаться эффективнее.
Либо, если нужно сильно экономить на длине, то стоит просто изобрести спец последовательности, которые никогда не встретятся в ваших мета-данных и которыми можно заменить специальные символы файловой системы.
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625160
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625162
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerНужно в имени файла хранить некую бизнес информацию - строку. оказалось, что эта информация может содержать всякие хитрые символы, например "/". Это пока не точно, но надо придумывать workaround на всякий случай.

Есть идея использовать Base64.Плохая идея - далеко не все файловые системы регистрочувствительны.
NTFS, например, "case preserve, but case insensitive".
Идея хранить "странные вещи" в имени - плохая идея, но уж если очень хочется, то максимум - base36.
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625167
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,


BlazkowiczКаких ещё гарантий? Откуда нам знать сколько информации вы собрались хранить.

Пока мне тоже не понятно, но надо понимать, чтобы предостеречь когда будут обсуждения применимости данного решения.
Судя по всему как считать длину я понял:

4 * ceil(n/3)

Таким образом можно сказать, что имя файла должно быть не более, чем 189 символов.

Если оставить на расширение 7 символов скажем, то остаётся 182
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625173
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,


BlazkowiczЗапишешь один файл. Захочешь записать другой, а ОС тебе фигушки крутит. Потому что с её точки зрения имена одинаковые, а Base64 строки - разные. Нужно ещё уникальный ID добавлять.
Ну, и некоторые инструменты могут вдруг имя привести к одному регистру. Хотя, такое редкость.


В моём случае я слушаю sftp папку.

Из неё надо достать файл, по названию определить идентификатор "продукта". Выяснилось, что идентификатор может содержать /. Поэтому есть идея кидать в папку файл с заэнкоженным именем файла, а потом при разборе уже декодить. Что тоже так себе потому, что юзер должен будет это как-то сделать.
После разбора файл через POST отправляется во внешнюю систему.


Получается это уже будет ответственность внешней системы, что файл прилетел с тем же именем.
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625177
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovquestionerНужно в имени файла хранить некую бизнес информацию - строку. оказалось, что эта информация может содержать всякие хитрые символы, например "/". Это пока не точно, но надо придумывать workaround на всякий случай.

Есть идея использовать Base64.Плохая идея - далеко не все файловые системы регистрочувствительны.
NTFS, например, "case preserve, but case insensitive".
Идея хранить "странные вещи" в имени - плохая идея, но уж если очень хочется, то максимум - base36.
А какая разница ?

почему не Base32 например?
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625180
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerА какая разница? почему не Base32 например?
Чем больше символов в алфавите кодировки, тем меньше будет избыточность.
36, соответственно, оптимальнее чем 32. Но, если у вас там UTF-8 совместимый текст, то я бы не парился с кодировками а делал бы URL encoding.
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625181
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerИдея хранить "странные вещи" в имени - плохая идея, но уж если очень хочется, то максимум - base36.А какая разница ?Принципиальная.почему не Base32 например?Потому, что кто-то не обращает внимания на словосочетание "как максимум"?
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625185
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorovquestionerпропущено...
А какая разница ?Принципиальная.почему не Base32 например?Потому, что кто-то не обращает внимания на словосочетание "как максимум"?

Если будет меньше символов, то длина, очевидно, должна драматично вырасти.

В чем принципиальная разница?
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625190
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczquestionerА какая разница? почему не Base32 например?
Чем больше символов в алфавите кодировки, тем меньше будет избыточность.
36, соответственно, оптимальнее чем 32. Но, если у вас там UTF-8 совместимый текст, то я бы не парился с кодировками а делал бы URL encoding.

Да, так наверное тоже подойдёт.

А что плохого в избыточности?

Я пока понял только то, что чем меньше символов в кодировке, тем более длинная строка нудна для кодирования при прочих равных условиях
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625239
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerВ чем принципиальная разница?В том, что base64 зависит от регистра символов, base36 - не зависит, а ограничения файловой системы - реальность, с которой надо считаться.

P.S. Построить иерархию продуктов в иерархии каталогов файловой системы - вообще никак?
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625313
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не все сообщения внимательно прочитал, но, подумалось.
А вот зачем хранить какую-то инфу в имени файла, когда в нём можно хранить лишь уникальный сгенерированный урл/айди или что-то подобное, а затем или в бд или в другом источнике брать уже те данные, которые прикреплены к этому урлу/айди.
Потому что при хранении в Base64 всё равно всё не получается сохранить и приходится читать и перекодировать, т.е. всё равно куда-то сначала эту инфу отдавать на обработку.
Да, соглашусь, что чтение из имени и перекодировка быстрее, чем работа с бд или каким-то локальным архивом, тем не менее, как идея - отказаться от этой(автора) идеи )))
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625317
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,

Можно просто файл рядом положить оригинальное имя+специальное расширение. И писать в него что угодно какой угодно длины.
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625335
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner, мне как-то понадобилось в имена zip-архива складывать нестандартные символы (точки, двоеточия и звездочки).

Я делал их замену на $xxxx где xxxx-код символа в Unicode. И сам символ $ также был заэкранирован.
Все работает хорошо только при чтении таких архивов нужно делать обратную операцию.

Преимущества моего метода в том что таих символов мало и этот реплейсмент в общем не искажает
имена файлов и они остаются читабельными.
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625422
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovquestionerВ чем принципиальная разница?В том, что base64 зависит от регистра символов, base36 - не зависит, а ограничения файловой системы - реальность, с которой надо считаться.

Тогда это имеет в принципе смысл, но конкретно в моём случае бесполезно.
Basil A. Sidorov
P.S. Построить иерархию продуктов в иерархии каталогов файловой системы - вообще никак?

Так и предполагается делать. нижней частью иерархии будет идентификатор. Не очень понял ход ваших мыслей.
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625425
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NixicНе все сообщения внимательно прочитал, но, подумалось.
А вот зачем хранить какую-то инфу в имени файла, когда в нём можно хранить лишь уникальный сгенерированный урл/айди или что-то подобное, а затем или в бд или в другом источнике брать уже те данные, которые прикреплены к этому урлу/айди.
Потому что при хранении в Base64 всё равно всё не получается сохранить и приходится читать и перекодировать, т.е. всё равно куда-то сначала эту инфу отдавать на обработку.
Да, соглашусь, что чтение из имени и перекодировка быстрее, чем работа с бд или каким-то локальным архивом, тем не менее, как идея - отказаться от этой(автора) идеи )))

Эти данные находятся непонятно где. Я так понимаю, что даже где попало и могут со временем переезжать с места на место. К тому же это более трудоемко. Клиент хочет подешевле.
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625428
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczNixic,

Можно просто файл рядом положить оригинальное имя+специальное расширение. И писать в него что угодно какой угодно длины.

Идея в том, чтобы юзер кинул файлы на сфтп и забыл про них.

Если идти путём, который Вы предлагаете, то придётся как-то гарантировать, что сначала считается оригинальный файл и только потом метаданные. Также этот путь ведет к ошибкам. Что будет если юзер забыл кинуть метаданные. Или сначала кинул метаданные а файл забыл?
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625430
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonquestioner, мне как-то понадобилось в имена zip-архива складывать нестандартные символы (точки, двоеточия и звездочки).

Я делал их замену на $xxxx где xxxx-код символа в Unicode. И сам символ $ также был заэкранирован.
Все работает хорошо только при чтении таких архивов нужно делать обратную операцию.

Преимущества моего метода в том что таих символов мало и этот реплейсмент в общем не искажает
имена файлов и они остаются читабельными.

Выглядит как почти полный аналог UrlEncoder
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625441
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerBlazkowiczNixic,

Можно просто файл рядом положить оригинальное имя+специальное расширение. И писать в него что угодно какой угодно длины.

Идея в том, чтобы юзер кинул файлы на сфтп и забыл про них.

Если идти путём, который Вы предлагаете, то придётся как-то гарантировать, что сначала считается оригинальный файл и только потом метаданные. Также этот путь ведет к ошибкам. Что будет если юзер забыл кинуть метаданные. Или сначала кинул метаданные а файл забыл?
Почему это должен делать юзер? Это(файл или еще что-то) делается (генерируется) в процессе загрузки файла.
Вы можете считать сначала имя файла, затем найти по нему файл с метаданными, считать их и решить, нужно ли читать файл с данными.
п.с. Ни разу не сталкивался: а что нельзя считать имя файла без подгрузки всего содержимого файла? 99.9% что можно, надо просто погуглить :)
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625442
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Не очень понял ход ваших мыслей.Мысли у меня предельно прямолинейные.
Если в списке возможных символов упоминается слэш (косая черта), то это "нативный" разделитель путей и он должен быть не в имени файла, а в иерархии каталогов файловой системы.
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625446
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovЕсли в списке возможных символов упоминается слэш (косая черта), то это "нативный" разделитель путей и он должен быть не в имени файла, а в иерархии каталогов файловой системы.
Более того: слеш не может быть в имени файла физически :)
Почти никогда... а вот это я на всякий случай, мало ли где возможно )))
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625451
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicБолее того: слеш не может быть в имени файла физически :)Чисто технически хрюниксы не допускают только нуль-байты - ограничение строкового API.
Но, в здравом уме и твёрдой памяти, никто не станет извращаться, чтобы, таки упихнуть.
...
Рейтинг: 0 / 0
Base64 для имён файлов
    #39625472
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nixicquestionerпропущено...


Идея в том, чтобы юзер кинул файлы на сфтп и забыл про них.

Если идти путём, который Вы предлагаете, то придётся как-то гарантировать, что сначала считается оригинальный файл и только потом метаданные. Также этот путь ведет к ошибкам. Что будет если юзер забыл кинуть метаданные. Или сначала кинул метаданные а файл забыл?
Почему это должен делать юзер? Это(файл или еще что-то) делается (генерируется) в процессе загрузки файла.
Вы можете считать сначала имя файла, затем найти по нему файл с метаданными, считать их и решить, нужно ли читать файл с данными.
п.с. Ни разу не сталкивался: а что нельзя считать имя файла без подгрузки всего содержимого файла? 99.9% что можно, надо просто погуглить :)

Исходные данные это то, что пользователь приложения имеет файл, который он кинет на сфтп.
Приложение будет его парсить.

В любом случае этот путь не очень удобен пользователю потому, что он может что-то забыть
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Base64 для имён файлов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]