ИСПРАВЛЕНО: multipart / form-data html form отправляет файлы .fla c в Google Speech-to-Text API, загружает файлы как x-fla c? - PullRequest
1 голос
/ 09 июля 2020

Исправление

await storage.bucket(bucketName).upload(`./uploads/${filename}`, {
    gzip: false,
    metadata: {
      content_type : "audio/flac",
      originalMimeType: "audio/flac",
      cacheControl: 'public, max-age=31536000',
      uploadType: "multipart"      
    },

Я не совсем уверен, почему это сработало, но мой инструктор предложил внести это изменение: set gzip: false. Теперь это успешно расшифровывает короткий и длинный звук из ведра. Возможно, это была проблема с кодированием содержимого.

Предыдущая проблема

Я делаю приложение преобразования речи в текст express в Node.js для проект учебного курса по кодированию. В настоящее время у меня возникла проблема с multer или процессом, во время которого файл загружается в мою "корзину" Google. Я могу вручную загрузить файлы .fla c в корзины Google, и тип файла останется как «audio / fla c». Я могу отправить эти файлы в API для довольно точной расшифровки. Однако при отправке файлов через мою составную форму и асинхронную c функцию uploadFile объекты будут загружены в корзины Google как «audio / x-fla c», и их нельзя будет воспроизвести или расшифровать. В моем интерфейсе пользователи должны увидеть форму, в которой они могут отправить файл .fla c. У меня вопрос: какие шаги мне нужно предпринять, чтобы убедиться, что файл остается «audio / fla c» по сравнению с «audio / x-fla c» при загрузке в корзину Google?

Вот как эта форма работает во внешнем интерфейсе:

        method="POST" enctype="multipart/form-data">
        <input type="file" id="audio" name="filename" class="btn">
        <input type="submit" class="btn">
    </form>

Вот как выглядит мой бэкэнд:

//set the destination of the form uploads to disk storage
let mStorage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, "./uploads")
  },
  filename: function (req, file, cb) {
    //set the extension to the original extension from form input
    cb(null, file.fieldname + Date.now() + path.extname(file.originalname));
    // cb(null, file.buffer)
  }
})

//initialize the upload variable
let uploads = multer({storage: mStorage})

//Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');
const storage = new Storage();
const speech = require('@google-cloud/speech');
const client = new speech.SpeechClient();

router.post("/results", uploads.single("filename"),(req, res) => {
  console.log("post route hit");
  //get the input field from the user
  // console.log(req.file);
  let filename = req.file.filename;
  console.log(filename);
  const bucketName = 'voiceappbucket';
  async function uploadFile() {
    // Uploads a local file to the bucket
  await storage.bucket(bucketName).upload(`./uploads/${filename}`, {
    gzip: true,
    metadata: {
      content_type : "audio/flac",
      cacheControl: 'public, max-age=31536000',
      uploadType: "multipart"      
    },
  });
  console.log(`${filename} uploaded to ${bucketName}.`);
  res.redirect(`/${req.file.filename}`)
  }
  uploadFile().catch(console.error);
})

Если бы у кого-то были похожие проблемы и они успешно прошли их, я бы с удовольствием услышать от вас. Мы будем благодарны за отзывы о моем коде или способ, которым я задал этот вопрос, поскольку я новичок в сообществе! : -)

...