Неправильный тип MIME после использования резкого API с приложением Firebase / Angular - PullRequest
0 голосов
/ 05 декабря 2018

Я звоню sharp(tmpFilePath).resize(150, 150).toFile(resizedFilePath) (используя этот точный API: http://sharp.pixelplumbing.com/en/v0.15.1/api/), но создаваемый выходной файл отображается как тип application/octet-stream, а не image/jpeg, который является исходным типом файла. IЯ использую Angular и загружаю / выгружаю в хранилище Firebase через облачные функции. Когда я загружаю исходный файл и загружаю его прямо обратно в Firebase, не вызывая сначала точный API, новый загруженный файл - это image/jpeg файл, как и ожидалось.

Первоначально я следовал этому руководству (https://angularfirebase.com/lessons/image-thumbnail-resizer-cloud-function/), но на самом деле я не мог получить доступ к своему хранилищу, используя его метод, ИЛИ тот, что в документации Firebase: const gcs = require('@google-cloud/storage')();, но я смог получить к нему доступ через администраторас const bucket = admin.storage().bucket(object.bucket);. Кажется подозрительным, что мне пришлось использовать этот обходной путь, но, опять же, моя функция работает хорошо, если я пропускаю вызов sharp api ... так что я просто не знаю, что это коренная причинамоей проблемы?

Я отправил эту проблему на github (https://github.com/lovell/sharp/issues/1493), но владелец, похоже, считает, что проблема не связана с sharp. Есть идеи, что я сделал сРонг здесь?Или кто-нибудь может хотя бы помочь мне сузить проблему, чтобы я мог попробовать поискать в Google лучше?

Исходный файл:
image

Файл, возвращаемый Sharp API:
image

Моя функция из index.ts:

import * as functions from 'firebase-functions';

import { tmpdir } from 'os';
import { join, dirname } from 'path';

import * as sharp from 'sharp';
import * as fs from 'fs-extra';

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

export const resizeImages = functions.storage.object().onFinalize(async object => { 
try {
    console.log(object);
    const bucket = admin.storage().bucket(object.bucket);
    const filePath = object.name;
    const fileName:string = filePath.split('/').pop();
    const bucketDir = dirname(filePath);
    console.log("filePath: " + filePath + "; fileName: " + fileName + "; bucketDir: " + bucketDir);

    if (bucketDir === 'profile-image' && object.contentType.includes('image')){
        console.log("A profile picture was added...")
        //The file is a profile picture...
        if (fileName.includes('unsized@')) {
            console.log("The picture that was added hasn't been sized yet...")
            //The file needs to be resized...
                const workingDir = join(tmpdir(), 'thumbs');
                const tmpFilePath = join(workingDir, fileName);

                // 1. Ensure thumbnail dir exists
                await fs.ensureDir(workingDir); 

                // 2. Download Source File
                await bucket.file(filePath).download({
                destination: tmpFilePath
                });
                console.log("Downloaded the source file");
                console.log(tmpFilePath);

                // 3. Resize the image  ********THIS PART IS NOT HAPPENING CORRECTLY
                console.log("About to start resizing...");
                const resizedfileName: string = fileName.split('@').pop();
                const resizedFilePath = join(workingDir, resizedfileName);
                await sharp(tmpFilePath).resize(150, 150).toFile(resizedFilePath);
                console.log("The image resizing is complete: "+ resizedFilePath);

                // 4. Upload the resized image
                const resizedImageUploadSnapshot = await bucket.upload(resizedFilePath, {destination: join('profile-image', resizedfileName)});
                console.log("Uploaded the resized image ");

                // 5. Cleanup remove the tmp/thumbs from the filesystem
                await fs.remove(workingDir);
                console.log("FUNCTION COMPLETED SUCCESSFULLY!")
                return true;
        } else {
            return false;
        }
    } else {     
        console.log('exiting function');
        return false;
    }

} catch (error) {
    console.log(error);
    return error;
}

Мой файл package.json из папки функций:

{
  "name": "functions",
  "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc",
    "serve": "npm run build && firebase serve --only functions",
    "shell": "npm run build && firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "main": "lib/index.js",
  "dependencies": {
    "@google-cloud/storage": "^2.3.1",
    "firebase-admin": "~6.0.0",
    "firebase-functions": "^2.1.0",
    "firebase-tools": "^6.1.1",
    "fs-extra": "^7.0.1",
    "sharp": "^0.21.0",
    "stripe": "^6.15.1"
  },
  "devDependencies": {
    "tslint": "~5.8.0",
    "typescript": "^3.2.1"
  },
  "private": true
}

1 Ответ

0 голосов
/ 11 декабря 2018

Я решил эту проблему, добавив к моим путям расширение файла:

const tmpFilePath = join(workingDir, fileName + '.jpeg');  

и

const resizedFilePath = join(workingDir, resizedfileName + '.jpeg');
...