使用javascript将文件上传到parse.com

时间:2015-01-11 15:58:04

标签: javascript file-upload parse-platform

我正在尝试使用带有以下代码的javascript上传要解析的文件数组:

HTML:

<fieldset>
    <input type="file" name="fileselect" id="fileselect" multiple></input>
    <input id="uploadbutton" type="button" value="Upload"> </input>
</fieldset>

JS:

$('#uploadbutton').click(function () {
    var fileUploadControl = $("#fileselect")[0];
    if (fileUploadControl.files.length > 0) {
        var file = fileUploadControl.files[0];
        var name = "style.css";
        var parseFile = new Parse.File(name, file);
        var filesArray = [parseFile];
    }
    parseFile.save().then(function() {
        // The file has been saved to Parse.
    }, function(error) {
        // The file either could not be read, or could not be saved to Parse.
    });
    var newStore = new Parse.Object("FileStore");
    newStore.set("files", filesArray);
    newStore.save();
});

我上传到一个名为FileStore的类,其中包含当前设置为数组的键“files”,我希望拥有一个文件数组。这是上传多个文件进行解析的最佳方法吗?我的代码现在不能正常工作。我的目标是让我的班级中的每个对象都有多个文件。

2 个答案:

答案 0 :(得分:1)

小心异步代码。目前,您的代码将遇到竞争条件,因为您在newStore.save()完成之前致电parseFile.save(),因此很可能会失败。

处理newStore的3行应该在parseFile.save()的成功处理程序中,例如:

parseFile.save().then(function() {
    // The file has been saved to Parse.
    var newStore = new Parse.Object("FileStore");
    newStore.set("files", filesArray);
    newStore.save();
}, function(error) {
    // The file either could not be read, or could not be saved to Parse.
});

当您保存多个文件时,您需要等待所有文件完成才能完成下一步。您可以将您的承诺链接在一起,以便在SeriesParallel中运行。

对于你想要的东西,Parallel会正常工作:

var fileSavePromises = [];

// assuming some code that creates each file has stored the Parse.File objects in an
// array called "filesToSave" but not yet called save
_.each(filesToSave, function(file) {
    fileSavePromises.push(file.save());
});

Parse.Promise.when(fileSavePromises).then(function() {
    // all files have saved now, do other stuff here
    var newStore = new Parse.Object("FileStore");
    newStore.set("files", filesToSave);
    newStore.save();
});

答案 1 :(得分:0)

我已经设法在@Timothy代码的帮助下解决了这个问题,编辑后的完整代码:

    var fileUploadControl = $("input[type=file]")[0];
    var filesToSave = fileUploadControl.files;

    var fileSavePromises = [];

    // assuming some code that creates each file has stored the Parse.File objects in an
    // array called "filesToSave" but not yet called save
    _.each(filesToSave, function(file) {
        var parseFile = new Parse.File("photo.jpg", file);
        fileSavePromises.push(
            parseFile.save().then(function() {
              // The file has been saved to Parse.
              $.post("/i", {
                file: {
                  "__type": "File",
                  "url": parseFile.url(),
                  "name": parseFile.name()
                }
              });
            })
        );
    });

    Parse.Promise.when(fileSavePromises).then(function() {
        // all files have saved now, do other stuff here
        window.location.href = "/";
    });