Как рассчитывается контрольная сумма в таблице BLOB-объектов для рельсов ActiveStorage - PullRequest
0 голосов
/ 02 июня 2018

Кто-нибудь знает, как вычисляется поле контрольной суммы в active_storage_blobs при использовании ActiveStorage на рельсах 5.2 +?

Кто-нибудь знает, как я могу заставить его использовать контрольную сумму md5, которая будет соответствоватьиз командной строки md5?

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

исходный код находится здесь: https://github.com/rails/rails/blob/master/activestorage/app/models/active_storage/blob.rb#L234

def compute_checksum_in_chunks(io)
  Digest::MD5.new.tap do |checksum|
    while chunk = io.read(5.megabytes)
      checksum << chunk
    end

    io.rewind
  end.base64digest
end

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

md5 = Digest::MD5.file(params[:file].tempfile.path).base64digest
puts "========= md5: #{md5}"

вывод:

========= md5: F/9Inmc4zdQqpeSS2ZZGug==

данные базы данных:

pry(main)> ActiveStorage::Blob.find_by(checksum: 'F/9Inmc4zdQqpeSS2ZZGug==')
  ActiveStorage::Blob Load (2.7ms)  SELECT  "active_storage_blobs".* FROM "active_storage_blobs" WHERE "active_storage_blobs"."checksum" = $1 LIMIT $2  [["checksum", "F/9Inmc4zdQqpeSS2ZZGug=="], ["LIMIT", 1]]
=> #<ActiveStorage::Blob:0x00007f9a16729a90
id: 1,
key: "gpN2NSgfimVP8VwzHwQXs1cB",
filename: "15 Celebrate.mp3",
content_type: "audio/mpeg",
metadata: {"identified"=>true, "analyzed"=>true},
byte_size: 9204528,
checksum: "F/9Inmc4zdQqpeSS2ZZGug==",
created_at: Thu, 29 Nov 2018 01:38:15 UTC +00:00>
0 голосов
/ 28 марта 2019

Давайте разберемся

Я знаю, что немного опоздал на вечеринку, но это больше для тех, кто сталкивается с этим в поиске ответов.Итак, вот оно:

Справочная информация:

В Rails появилось множество новых функций в версии 5.2, одной из которых было ActiveStorage.Официальный финальный релиз вышел 9 апреля 2018 года.

Отказ от ответственности:

Итак, чтобы быть совершенно ясным, следующая информация относится к стандартному vanilla активному хранилищу.Это также не учитывает какой-то сумасшедший код-фу, который вращается вокруг какого-то одного сценария.

При этом контрольная сумма рассчитывается по-разному в зависимости от настроек Active Storage.Благодаря встроенному хранилищу Rails «из коробки» существует 2 «типа» ( из-за отсутствия лучшего термина ) конфигурации.

  1. Загрузка прокси
  2. Прямые загрузки

Загрузка прокси

Поток загрузки файлов: [Клиент] → [Приложение RoR] → [ХранилищеСервис]

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

В ответе SparkBao указывается выше «Загрузка прокси».Это означает, что вы загружаете файл в приложение RoR и выполняете какую-то обработку перед отправкой файла в сконфигурированную службу хранения (AWS, Azure, Google, BackBlaze и т. Д.) * .Даже если вы установите службу хранилища на «локальный диск», логика все равно технически применима, даже если ваше приложение RoR является конечной точкой хранилища.

Подход " Proxy Upload " не идеален для приложений RoR, которые развертываются в облаке на таких сервисах, как Heroku.У Heroku есть жесткое ограничение в 30 секунд для завершения транзакции и отправки ответа вашему клиенту (конечному пользователю).Таким образом, если ваш файл довольно большой, вам необходимо учитывать время, необходимое для его загрузки, а затем учитывать количество времени для расчета контрольной суммы.Если вы попали в сценарий, в котором вы не можете выполнить запрос с ответом в течение 30 секунд, вам нужно будет использовать подход « Прямая загрузка ».

Proxy Uploads Ответ:

Класс Ruby Дайджест :: MD5 используется в методе compute_checksum_in_chunks (io) , как указано Spark.Bao.


Прямые загрузки

Поток загрузки файлов: [Клиент] → [Служба хранения]

Comm.Поток: [Клиент] → [Приложение RoR] → [Клиент] → [Служба хранения] → [Клиент] → [Приложение RoR] → [Клиент]

Наши хорошие друзья, которые поддерживают иРазработка Rails уже сделала всю тяжелую работу для нас.Я не буду вдаваться в подробности о том, как настроить прямую загрузку, но вот ссылка на то, как » Rails EdgeGuide - Прямые загрузки .

Загрузка прокси-ответов:

Теперь, с учетом всего вышесказанного, с помощью стандартной настройки Direct Uploads , контрольная сумма файла вычисляется путем использования * 1105.* SparkMD5 (JavaScript).

Ниже приведен фрагмент исходного кода активного хранилища Rails (activestorage.js)

  var fileSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;
  var FileChecksum = function() {
    createClass(FileChecksum, null, [ {
      key: "create",
      value: function create(file, callback) {
        var instance = new FileChecksum(file);
        instance.create(callback);
      }
    } ]);
    function FileChecksum(file) {
      classCallCheck(this, FileChecksum);
      this.file = file;
      this.chunkSize = 2097152;
      this.chunkCount = Math.ceil(this.file.size / this.chunkSize);
      this.chunkIndex = 0;
    }
    createClass(FileChecksum, [ {
      key: "create",
      value: function create(callback) {
        var _this = this;
        this.callback = callback;
        this.md5Buffer = new sparkMd5.ArrayBuffer();
        this.fileReader = new FileReader();
        this.fileReader.addEventListener("load", function(event) {
          return _this.fileReaderDidLoad(event);
        });
        this.fileReader.addEventListener("error", function(event) {
          return _this.fileReaderDidError(event);
        });
        this.readNextChunk();
      }
    },

Заключение

Если я что-то пропустил, заранее прошу прощения.Я старался быть как можно более тщательным.

Итак, чтобы подвести итог, достаточно приемлемого ответа:

  • Конфигурация загрузки прокси: Рубиновый класс Дайджест :: MD5

  • Конфигурация прямой загрузки: Хэш-библиотека JavaScript SparkMD5 .

0 голосов
/ 02 июня 2018

Это дайджест MD5-данных блоба в кодировке base64.Боюсь, что Active Storage не поддерживает шестнадцатеричные контрольные суммы, такие как md5 (1) .Извините!

...