Как из blob узнать имя файла

Обновлено: 06.07.2024

У меня есть процедура pl / sql, которая возвращает Blob. Вот как я это называю:

Теперь я хочу получить имя файла из blob. Как я могу это сделать?

2 ответа

Как вы устанавливаете имя файла blob в JavaScript при принудительной загрузке его через window.location ? function newFile(data) < var json = JSON.stringify(data); var blob = new Blob([json], ); var url = window.URL.createObjectURL(blob);.

Столбец BLOB не хранит имя файла. Вам нужно добавить отдельный столбец типа VARCHAR2 для хранения исходного имени файла.

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

Вам нужно будет изменить Blob на File . Попробуйте этот код:

Похожие вопросы:

В app-engine, учитывая BlobKey и ничего, кроме ключа blob-объекта, как вы получаете имя файла, на который указывает ключ blob-объекта? Например, если файл image1.jpg . Как получить имя файла.

Это вопрос на стороне сервера. У меня есть BlobKey и больше ничего. Как мне получить имя файла blob-объекта из указанного BlobKey? Я знаю, как получить servingUrl как ServingUrlOptions options =.

Как установить имя файла для blob в typescript? Для IE я могу легко настроить имя файла, но для Chrome это выглядит невозможным. В принципе мне нужно что-то похожее на это решение , но с typescript.

В настоящее время я загружаю изображения, вставленные из буфера обмена, со следующим кодом: // Turns out getAsFile will return a blob, not a file var blob = event.clipboardData.items[0].getAsFile().

Как вы устанавливаете имя файла blob в JavaScript при принудительной загрузке его через window.location ? function newFile(data) < var json = JSON.stringify(data); var blob = new Blob([json],

Я пытаюсь автоматически загрузить blob, как это: blobGeneratingFunction.then(blob => < // blob => Blob(3797539) let file = new Blob([blob], < type.

У меня есть существующая таблица базы данных Oracle, в которой поле BLOB содержит файлы, я хочу извлечь имя файла и расширение из поля BLOB, Любое предложение будет оценено по достоинству

Я пытаюсь извлечь имя файла в хранилище blob-объектов, чтобы использовать его в своем сценарии дальше. Я попытался с помощью списка больших двоичных объектов для хранения списка AZ и капли.

Я хотел бы удалить все файлы в моем хранилище azure blob. Для этого я перечисляю все большие двоичные объекты в своем хранилище с помощью listBlobsSegmented() , а затем передаю результаты в.

Но как я узнать что там .doc или еще что-то.

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

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

или может быть, в соседних столбцах хранится имя файла (приличные люди так делают).

Тот кто ставил задачу, этого точно не знает :)
Столбца с именем тоже нет.

Аттач прикрепляется через приложение, которое работает через ODBC и написано на DELPHi.

Это вопрос бизнеса. Разработчик не открывает исходники. Соответственно, как он узнает расширение, тоже не сообщает.
Столбца точно нет. Я структуру этой базы знаю вдоль и поперек.

самое простое решение - это спросить у разработчика.

потому что если файлы используются, значит все же где-то есть информация об их типе. а она может быть и в другой таблице.
оттрасируйте библиотечную сессию, которая вытаскивает файл
трассировка покажет имена столбцов, дальше вы <i>догадаетесь</i> в котором из них найти расширение. по-другому как узнать, я не знаю.

самое простое решение - это спросить у разработчика.

потому что если файлы используются, значит все же где-то есть информация об их типе. а она может быть и в другой таблице.
оттрасируйте библиотечную сессию, которая вытаскивает файл
трассировка покажет имена столбцов, дальше вы <i>догадаетесь</i> в котором из них найти расширение. по-другому как узнать, я не знаю.

включаете вот так трассировку для своей "библиотечной" сессии.

жмете на кнопки (выгружаете свои блобы).

появляется файл с некой непонятной информацией.
допустим, его имя master_ora_23927.trc
дальше запускаете обработку этого файла утилитой tkprof.

Так устроены программы восстановления данных (Easy Recovery).
Кстати, из нее и можно вытащить эти сигнатуры.

включаете вот так трассировку для своей "библиотечной" сессии.

жмете на кнопки (выгружаете свои блобы).

появляется файл с некой непонятной информацией.
допустим, его имя master_ora_23927.trc
дальше запускаете обработку этого файла утилитой tkprof.


В данной статье я хочу рассмотреть FileSystem API и File API, разобраться с его методами и показать пару полезных штук. Эта статья является компиляцией материалов с html5rocks (1, 2, 3). Все представленные ниже демки можно посмотреть по первым двум ссылкам. Третья ссылка так же предлагает ряд интересных демо. Ну а теперь займемся изучением материала.

В качестве введения

С помощью FileSystem API и File API веб приложение может создавать, читать, просматривать и записывать файлы находящиеся в области пользовательской «песочницы».

  • Чтение и управление файлами: File/Blob, FileList, FileReader
  • Создание и запись: BlobBuilder, FileWriter
  • Работа с директориями и права доступа: DirectoryReader, FileEntry/DirectoryEntry, LocalFileSystem
  1. File — собственно файл; позволяет получить такую доступную только для чтения информацию, как имя, размер, mimetype и прочее.
  2. FileList — «массив» объектов File.
  3. Blob — сущность, позволяющая разбирать файл по байтам.
Поддержка браузерами и ограничение на хранение

На момент написания статьи только Google Chrome 9+ имеет рабочую реализацию FileSystem API. И на данный момент пока нет никаких диалоговых окон для управления файлами и квотами на хранилище, поэтому нужно будет использовать флаг --unlimited-quota-for-files (в случае разработки приложений для Chrome Web Store будет достаточно манифеста с разрешением unlimitedStorage). Но все меняется и пользователи в скором времени получат возможность для управления правами по работе с файлами, которые будут требоваться приложению.

Вам может потребоваться использование флага --allow-file-access-from-files , если вы дебажите приложение с использованием file://. Если этот флаг не использовать, то будут выброшены исключения типа SECURITY_ERR или QUOTA_EXCEEDED_ERR.

Обращаемся к файловой системе

Проверим поддержку браузером нужных нам функций

Веб приложение может обратиться к файловой системе (естественно в ограниченной «песочнице») вызвав следующий метод window.requestFileSystem():

Правила хранения, доступные значения window.TEMPORARY и window.PERSISTENT. данные, хранящиеся с использованием ключа TEMPORARY могут быть удаление по усмотрению браузером (например, если не хватает места). Если же выставлен ключPERSISTENT, то данные могут быть очищены только после действий пользователя или приложения.
Размер (в байтах) хранилища, которое потребуется приложению.
Callback-функция, выполняемая в случае успешного обращения к файловой системе. Ее аргументом является объект типа FileSystem.
Необязательная callback-функция для обработки ошибок. Так же вызывается, когда возникают ошибки обращения к файловой системе. Параметром является объект типа FileError.

Если вы вызываете метод requestFileSystem() в рамках вашего приложения в первый раз, то в этот момент и будет создано хранилище. Очень важно помнить, что данное хранилище является закрытым и другое приложение не будет иметь к нему доступа. Это так же значит, что приложение не может менять прочие файлы и папки, расположенные на жестком диске.

Спецификация по FileSystem так же описывает API для синхронной работы, а именно интерфейс LocalFileSystemSync, который предполагается использовать совместно Web Workers. Но в этой статье данное API не будет рассмотрено.

Возвращаясь к методу requestFileSystem() стоит описать возможные варианты возникающих ошибок:

Описанный пример очень прост, но по сути является заготовкой для дальнейшей работы с возникающими ошибками.

Работа с файлам

Для работы с файлам предусмотрен интерфейс FileEntry. Он обладает рядом методов и свойств, которые мы привыкли ассоциировать с обычными файлами. Приведем их ниже:

Разберем на примерах азы работы с FileEntry.

Создание файла

Получить или создать файл можно с помощью метода getFile() у интерфейса DirectoryEntry. После обращения к хранилищу, callback возвращает нам объект FileSystem, содержащий в себе DirectoryEntry (fs.root), ссылающийся на корневую папку хранилища.

Следующий код создаст пустой файл «log.txt»:

Итак, после обращения к файловому хранилищу, у нас в руках оказывается FileSystem. Внутри сallback-функции мы можем обратится к методу fs.root.getFile(), передав имя файла, который требуется создать. Можно передать как относительный, так и абсолютный путь — главное чтобы он был верным. Например, ошибочным будет создание файла, если его родительская папка не существует. Вторым аргументом метода getFile() является объект, описывающий параметры объекта, которые будут к нему применены, если он еще не создан. Более подробно можно прочитать в документации.

Чтение файла по имени

Следующий код обращается к файлу «log.txt» и читает его содержимое с помощью FileReader API, после чего записывает все содержимое в блок <textarea>. Если файл не существует, то будет выброшена ошибка.

  • FileReader.readAsBinaryString(Blob|File) — результат будет содержать байтовую строку.
  • FileReader.readAsText(Blob|File, opt_encoding) — результат будет содержать текстовую строку. Кодировка по умолчанию — 'UTF-8', менять можно с помощью задания опционального параметра
  • FileReader.readAsDataURL(Blob|File) — на выходе имеем data URL.
  • FileReader.readAsArrayBuffer(Blob|File) — получаем данные в виде ArrayBuffer.

Иногда нам может потребоваться не весь файл, а лишь его часть, для этого удобно использовать File.slice(start_byte,length).
Выглядит это так:

В следующем примере мы сможем прочитать либо нужные на байты, либо весь файл целиком. Особое внимание обратите на onloadend и evt.target.readyState, которые в данном случае будут заменять нам событие onload. (О событиях чуть ниже).

  • onloadstart
  • onprogress
  • onload,
  • onabort
  • onerror
  • onloadend
Запись в файл

С помощью следующего кода мы создадим файл «log.txt» (если он не существует) и запишем в него 'Ipsum Lorem'.

Как видно, мы обращаемся к методу createWriter() для получения объекта. Кроме этого, мы обрабатываем события окончания записи в файл и возможного создания ошибки.

Дописываем данные в файл

Следующий код допишет 'Hello World' в конец файла. Если файла нет, то выброситься ошибка.

Создание копий выбранных файлов

Следующий код позволяет пользователю выбирать несколько файлов, используя <input type=«file» multiple> и создает копии этих файлов.


Для упрощения выбора файлов можно использовать HTML5 Drag and Drop.

Удаление файлов

Следующий код удалит 'log.txt'.

Работа с директориями

Работа с директориями осуществляется за счет использования DirectoryEntry, который обладает большинством свойств FileEntry ( они оба наследуют интерфейс Entry). Перечислим ниже свойства и методы DirectoryEntry.

Создание директорий

Для создания и обращения к директориям используется getDirectory() интерфейса DirectoryEntry. Можно передавать как имя, так и путь до директории.

Создадим в корне директорию «MyPictures»:

Поддиректории

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

Теперь у нас создана директория «music/genres/jazz» и мы можем обращаться к любому ее уровню и создавать в них новые файлы. Например:

Разбираем содержимое директории

Чтобы узнать, что содержится в директории нужно создать DirectoryReader и вызвать его метод readEntries(), но при этом нет гарантии, что вернется все содержимое выбранной директории (. ). Это значит, что надо обращаться к методу DirectoryReader.readEntries(), пока результат не станет пустым. Пример:

Удаляем директорию

Для удаления следует вызвать метод DirectoryEntry.remove(). Важно знать, что если попытаться удалить не пустую директорию, то будет выброшена ошибка.

Удалим пустую директорию «jazz» из "/music/genres/":

Рекурсивно удаляем директории

Если у вас есть не пустая директория и вы все же хотите ее удалить, то вам поможет метод removeRecursively(), который удалить и директорию и все ее содержимое.

Произведем эту операцию с директорией «music»:

Копируем, переименовываем и перемещаем

FileEntry и DirectoryEntry полностью идентичны в этом аспекте.

Копируем

И FileEntry и DirectoryEntry имеют метод copyTo() для копирования. В случае директорий, метод рекурсивно создаст и все содержимое.

Скопируем «me.jpg» из одной директории в другую:

Перемещение или переименование

У FileEntry и DirectoryEntry есть метод moveTo(), позволяющие перемещать и переименовывать файлы и директории. Первым аргументом является родительская папка, вторым (опциональным) параметром является новое имя.

Переименуем «me.jpg» в «you.jpg»:


Переместим «me.jpg» из корневой директории в «newfolder».

Use Cases

HTML5 предлагает несколько вариантов локального хранения данных, но FileSystem отличается тем, что позволяет удовлетворить те потребности, которые не удовлетворяют базы данных. В основном, это нужды приложение, которые хранят большой объем бинарных данных и/или предоставляет доступ к файлам приложениям вне браузера.

Работа с BLOB-типом данных SQLite с помощью PHP PDO

В этом уроке вы узнаете, как управлять BLOB-данными в базе данных SQLite с помощью PHP PDO.

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

Мы создадим новую таблицу под названием документы для демонстрации.

Запись BLOB в таблицу

Чтобы вставить BLOB-данные в таблицу, используйте следующие шаги:

    SQLite, создав экземпляр класса PDO.
  • Используйте функцию fopen() , чтобы прочитать файл. Функция fopen() возвращает указатель на файл.
  • Подготовьте оператор INSERT к выполнению, вызвав метод prepare() объекта PDO. Метод prepare() возвращает экземпляр класса PDOStatement .
  • Используйте метод bindParam() объекта PDOStatement , чтобы связать параметр с именем переменной. Для данных BLOB вы привязываете параметр к указателю файла.
  • Вызовите метод execute() объекта оператора PDO.

Например, следующий метод insertDoc() класса SQLiteBLOB вставляет новый документ в таблицу документов, используя описанные выше шаги:

Следующий скрипт index.php вставляет два документа: 1 файл PDF и 1 изображение из папки ресурсов в таблицу документов.

Чтение BLOB из таблицы

Чтобы прочитать BLOB из базы данных, мы добавляем новый метод readDoc() в класс SQLiteBLOB следующим образом:

Следующий скрипт document.php получает document_id из строки запроса и вызывает метод readDoc() для визуализации документа.

Например, на следующем снимке экрана показано, как скрипт document.php возвращает файл PDF в веб-браузере:

Обновление данных BLOB

Следующий метод updateDoc() обновляет данные BLOB в таблице документов:

В этом уроке мы узнали о способах: записывать, читать и обновлять BLOB-данные в базе данных SQLite с помощью PHP PDO.

Читайте также: