解析服务器 - 如何使用云代码从服务器中删除图像文件

Parse Server - How to delete image file from the server using cloud code

如何使用 Parse Cloud Code 从服务器中删除图像文件。我正在使用 back4app.com

删除图像行后

我正在获取图像 urls,然后使用它的 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);
        });
}

出于安全原因,无法使用 SDK 或 REST API 中的 DELETE 直接从 Back4App 中删除图像。我相信您可以按照以下指南操作:

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

经过一段时间的努力,似乎可以通过提到的云功能实现 here。 1个需要在云代码中使用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');
    }
});

我一开始感到困惑,因为即使我删除了仪表板中的引用对象,我仍然可以打开该文件的 link,但后来我发现仪表板没有调用 Parse.Cloud.beforeDelete() 由于某种原因触发。

通过云代码功能删除文件后,尝试从url下载数据returns 0kB数据,因此确认它们已被删除。