Parse Server - Как удалить файл изображения с сервера, используя облачный код

Как я могу удалить файл изображения с сервера, используя Parse Cloud Code. Я использую back4app.com

После удаления строки изображения

Я получаю URL-адреса изображений, затем вызываю функцию для удаления изображения, используя его URL

Parse.Cloud.afterDelete("Image", function(request) {

    // get urls
    var imageUrl = request.object.get("image").url();
    var thumbUrl = request.object.get("thumb").url();
    if(imageUrl!=null){
        //delete
        deleteFile(imageUrl);
    }
    if(thumbUrl!=null){
        //delete
        deleteFile(thumbUrl);
    }
});

Удалить файл изображения с сервера

function deleteFile(url){

        Parse.Cloud.httpRequest({
            url: url.substring(url.lastIndexOf("/")+1),
            method: 'DELETE',
            headers: {
                'X-Parse-Application-Id': 'xxx',
                'X-Parse-Master-Key':     'xxx'
            }
        }).then(function(httpResponse) {
            console.log(httpResponse.text);
        }, function(httpResponse) {
             console.error('Request failed with response code ' + httpResponse.status);
        });
}

2 ответа

Решение

По соображениям безопасности невозможно напрямую удалить изображение из Back4App, используя DELETE из SDK или REST API. Я считаю, что вы можете следовать руководству ниже:

https://help.back4app.com/hc/en-us/articles/360002327652-How-to-delete-files-completely-

После некоторой борьбы с этим, похоже, это возможно с помощью облачной функции, как упоминалось здесь . В облачном коде нужно использовать MasterKey:

      Parse.Cloud.define('deleteGalleryPicture', async (request) => {
    const {image_id} = request.params;
    const Gallery = Parse.Object.extend('Gallery');
    const query = new Parse.Query(Gallery);
    try {
        const Image = await query.get(image_id);
        const picture = Image.get('picture');

        await picture.destroy({useMasterKey:  true});
        await Image.destroy();
        return 'Image removed.';
    } catch (error) {
        console.log(error);
        throw new Error('Error deleting image');
    }
});

Для меня это сначала сбивало с толку, так как я мог открыть ссылку на этот файл даже после того, как я удалил ссылочный объект на панели инструментов, но потом я обнаружил, что панель не вызывает Parse.Cloud.beforeDelete() вызвать по какой-то причине.

Попытка загрузить данные с URL-адреса после удаления файла с помощью функции облачного кода возвращает данные размером 0 КБ и, следовательно, подтверждает, что они были удалены.

Другие вопросы по тегам