Сохранение большого двоичного объекта на сервере?

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

Если в звуковом файле есть изображение альбома, я могу превратить его в URL-адрес объекта большого двоичного объекта и использовать его локально, но как я могу сохранить это изображение большого двоичного объекта на сервере?

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

Я использую музыкальные метаданные (https://github.com/leetreveil/musicmetadata), и вот как я вытащить изображение из звукового файла.

musicmetadata(data, function(err, result){
            if(err)
                console.log(err);

            if(result.picture.length > 0){
                var picture = result.picture[0];
                var url = URL.createObjectURL(new Blob([picture.data], {'type':'image/' + picture.format}));
                var image = document.getElementById('albumImage');

                imageList.innerHTML = "<p>" + result.title + "." + picture.format + "</p>";

                image.style.backgroundImage = "url(" + url + ")";
                image.style.backgroundRepeat = "no-repeat";
                image.style.backgroundSize = "155px 131px";

                bgImage = url;
            } else {
                imageList.innerHTML = "<p>No image available in Meta Data<p>";
            }

Я пробовал formData для установки и добавления большого двоичного объекта в форму после его публикации, но он просто передается либо как undefined, либо как blob URL-адреса большого двоичного объекта: http://localhost:3000/5c9db74b-f4f1-4125-8839-a7604ec1f7f9

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

вот информация о моем почтовом запросе для загрузки на всякий случай.

var manageUpload = upload.fields([{ name: 'fileElem', maxCount: 1 }, { name: 'imageElem', maxCount: 1 } ]);
app.post('/upload', manageUpload, function(req, res){
    post = new Post();

    User.findOne({ username: req.session.user }, function(err, newUser){
        if(err) console.log(err);

        post.audioFile = req.files['fileElem'][0].filename;

        if(typeof req.files['imageElem'] !== "undefined"){
            post.imageFile = req.files['imageElem'][0].filename;
        }

        post._user = newUser._id;
        post.title = req.body.title;
        post.artist = req.body.artist;
        post.start = req.body.start;
        post.stop = req.body.stop;
        post.genre = req.body.genre;
        post.tags = req.body.tags;

        post.save(function(err, newPost){
            if(err) 
                console.log(err);
            if(newPost){
                res.redirect('/');
            }
        });
    });
});

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

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


person 0xef2387    schedule 05.11.2016    source источник


Ответы (1)


добавить [...] в форму после ее публикации

Вы не можете добавить в форму после того, как она была опубликована. Но вы можете отложить отправку формы до тех пор, пока не будут получены все ваши метаданные.

Я пробовал formData для установки и добавления blob [...], но он просто передает либо undefined, либо url blob

Похоже, вы передавали в форму свою url переменную, а не сам blob.

Надеюсь, этот фрагмент подскажет вам правильное направление.

$('#file-input').on('change', function() {
  var formData = new FormData();
  var file = this.files[0];

  musicmetadata(file, function(err, result) {
    var picture = result.picture[0];
    var picBlob = new Blob([picture.data], {
      'type': 'image/' + picture.format
    });

    formData.append('fileElem', file);
    formData.append('imageElem', picBlob);
    
    console.log(formData); // Do whatever you want with the data
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/musicmetadata/2.0.2/musicmetadata.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input id="file-input" type="file" name="file">

person schroffl    schedule 06.11.2016
comment
Спасибо, что нашли время помочь. Я попытался собрать код вместе, но когда я опубликовал и посмотрел на вкладку сети, чтобы увидеть, что было опубликовано с формой, imageElem - это Content-Type: application / octet-stream, а не image / jpeg, как я бы хотел. Есть идеи о том, как заставить его правильно публиковать? - person 0xef2387; 06.11.2016
comment
application/octet-stream просто обозначает двоичные данные, вы можете интерпретировать их как хотите, в том числе как изображение в формате jpeg. - person schroffl; 06.11.2016
comment
да, похоже, не работает. Я что-то упускаю. Вот мой текущий код. Может, я неправильно собрал все по кусочкам? pastebin.com/p2h0jxdX еще раз благодарим за помощь! - person 0xef2387; 06.11.2016
comment
Вы используете musicmetadata, чтобы получить кавер на песню, верно? Если да, то почему у вас есть элемент ввода для изображения в вашем html? - person schroffl; 06.11.2016
comment
на всякий случай, если в метаданных нет изображения. так что пользователь может предоставить его. - person 0xef2387; 06.11.2016
comment
Хорошо, я собираюсь создать суть на github и добавить комментарии к тем, где вы допустили некоторые ошибки. - person schroffl; 06.11.2016
comment
Спасибо, schroffl, я очень признателен помощникам! - person 0xef2387; 06.11.2016
comment
вздох. да, похоже, это все еще не работает. И я не уверен, какую еще информацию я могу дать вам, чтобы помочь разобраться в проблеме. Я проверил загруженные опубликованные данные на вкладке сети, и они показывают все, что заполнено, кроме imageElem. вот код, который у меня есть, в котором есть все, что есть у вас, и я также включил обработку маршрута для почтового запроса. pastebin.com/0vEtqmkg Я не знаю, как правильно это сохранить. Ваше здоровье. - person 0xef2387; 07.11.2016
comment
Позвольте нам продолжить это обсуждение в чате. - person schroffl; 07.11.2016