मैं sharp(tmpFilePath).resize(150, 150).toFile(resizedFilePath) को कॉल कर रहा हूं (इस तेज एपीआई का उपयोग करके: http://sharp .pixelplumbing.com/en/v0.15.1/api/) लेकिन जो आउटपुट फ़ाइल बनाई जा रही है, वह image/jpeg के बजाय application/octet-stream प्रकार के रूप में दिख रही है, जो कि मूल फ़ाइल प्रकार है। मैं एंगुलर का उपयोग कर रहा हूं और क्लाउड फ़ंक्शंस के माध्यम से फायरबेस स्टोरेज में डाउनलोड/अपलोड कर रहा हूं। जब मैं स्रोत फ़ाइल डाउनलोड करता हूं और पहले तेज एपीआई को कॉल किए बिना इसे सीधे फायरबेस पर अपलोड करता हूं, तो नई अपलोड की गई फ़ाइल अपेक्षित रूप से एक 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 एपीआई कॉल छोड़ देता हूं ... इसलिए मुझे नहीं पता कि यह मेरी समस्या का मूल कारण है ?

मैंने इस मुद्दे को जीथब पर सबमिट किया है (https://github.com/lovell/sharp/issues/1493) लेकिन मालिक को लगता है कि यह समस्या sharp से संबंधित नहीं है। कोई विचार मैंने यहाँ क्या गलत किया है? या क्या कोई कम से कम समस्या को कम करने में मेरी मदद कर सकता है ताकि मैं कुछ बेहतर Google खोजों को आजमा सकूं?

मूल फ़ाइल:
image

शार्प एपीआई द्वारा लौटाई गई फ़ाइल:
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
}
0
Kat 5 पद 2018, 20:12

1 उत्तर

सबसे बढ़िया उत्तर

मैंने अपने पथों में फ़ाइल एक्सटेंशन जोड़कर इस समस्या को हल किया है:

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

तथा

const resizedFilePath = join(workingDir, resizedfileName + '.jpeg');
0
Kat 11 पद 2018, 19:58