Давайте разберемся
Я знаю, что немного опоздал на вечеринку, но это больше для тех, кто сталкивается с этим в поиске ответов.Итак, вот оно:
Справочная информация:
В Rails появилось множество новых функций в версии 5.2, одной из которых было ActiveStorage.Официальный финальный релиз вышел 9 апреля 2018 года.
Отказ от ответственности:
Итак, чтобы быть совершенно ясным, следующая информация относится к стандартному vanilla активному хранилищу.Это также не учитывает какой-то сумасшедший код-фу, который вращается вокруг какого-то одного сценария.
При этом контрольная сумма рассчитывается по-разному в зависимости от настроек Active Storage.Благодаря встроенному хранилищу Rails «из коробки» существует 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();
}
},
Заключение
Если я что-то пропустил, заранее прошу прощения.Я старался быть как можно более тщательным.
Итак, чтобы подвести итог, достаточно приемлемого ответа: