在实际保存文件之前,如何使用 Cloud Code 读取保存到 Parse 服务器的文件?

How to read a file being saved to Parse server with Cloud Code, before actually saving it?

我正在尝试使用 Cloud Code 检查用户提交的图像是否属于受支持的文件类型并且不会太大。

我知道我需要在服务器端进行验证,我认为我应该使用 beforeSave 使用 Cloud Code 进行验证 – 该文档甚至有一个关于数据验证的具体示例,但它没有解释如何处理文件我想不通。

我已经尝试了记录的保存文件的方法,即

file = fileUploadControl.files[0];
var parseFile = new Parse.File(name, file);
currentUser.set("picture", parseFile);
currentUser.save();

并且在云代码中, Parse.Cloud.beforeSave(Parse.User, (request, response) => { // code here });

但是 1. 这实际上仍然将文件保存在我的服务器上,对吗?我想先检查文件大小以避免保存太多大文件...

和 2. 即便如此,我也不知道在 beforeSave 回调中要做什么。看来我只能访问已保存图片的 URL (证明它已上传),而且在决定是否要之前必须再做一个 https 请求来检查文件大小和类型似乎非常违反直觉继续将文件附加到用户对象。

(我目前正在使用 remote-file-sizefile-type 检查上传文件的大小和类型,但这里也没有成功)。

我也试过调用云函数,但感觉我做的事情不对,而且我 运行 遇到了同样的问题。 我可以调用 Cloud 函数并将已保存的 ParseFile 作为参数传递,然后我知道如何使用主密钥将其从 Cloud Code 保存到 User 对象,但如上所述它仍然涉及将文件上传到服务器然后重新- 使用它的 URL.

获取它

我在这里遗漏了什么吗? 有没有办法在 Parse.File 上执行类似 beforeSave 的操作,然后在文件不符合某些条件时停止保存文件?

干杯。

如果您必须对文件执行某些操作,parse 可让您覆盖文件适配器以处理文件操作。

您可以指定要在 ParseServer 实例化中使用的文件适配器:

    var FSStoreAdapter = require('./file_adapter');
    var api = new ParseServer({
      databaseURI: databaseUri ,
      cloud: process.env.CLOUD_CODE_MAIN || __dirname + '/cloud/main.js',
      appId: process.env.APP_ID,
      filesAdapter: fs_store_adapter, // YOUR FILE ADAPTER
      masterKey: process.env.MASTER_KEY, //Add your master key here. Keep it secret!
      serverURL: "https://yourUrl",  // Don't forget to change to https if needed
      publicServerURL: "https://yourUrl",
      liveQuery: {
        classNames: ["Posts", "Comments"] // List of classes to support for query subscriptions
      }
      maxUploadSize: "500mb"  //you will now have 500mb limit :)
    });

也就是说,您还可以在实例化中指定一个 maxUploadSize,如您在最后一行中所见。

你必须使用后台保存

file = ParseFile("filename", file)
file?.saveInBackground({ e ->
if (e == null) {

} else {
  Toast.makeText(applicationContext, "Error: $e", Toast.LENGTH_SHORT).show()

  e.printStackTrace()
  Log.d("DEBUG", "file " + e.code)
}
}, { percentDone ->
  Log.d("DEBUG", "file:" + percentDone!!)
})