2013-06-03 60 views
1

我在任何地方找到的答案都没有奏效。我试图扩展“开发Backbone.js应用程序”中的例子来上传文件。尽管表单具有enctype =“multipart/form-data”,但request.files始终未定义。backbonejs节点文件上传

形式HTML是:

<form id="addBook" action="..." enctype="multipart/form-data"> 
    <div> 
     <label for="coverImage">CoverImage: </label><input id="coverImage" name="coverImage" type="file" /> 
     <label for="title">Title: </label><input id="title" type="text" /> 
     <label for="author">Author: </label><input id="author" type="text" /> 
     <label for="releaseDate">Release date: </label><input id="releaseDate" type="text" /> 
     <label for="keywords">Keywords: </label><input id="keywords" type="text" /> 
     <button id="add">Add</button> 
    </div> 
</form> 

,节省了新的记录是

addBook: function(e) { 
    e.preventDefault(); 

    var formData = {}; 
    var reader = new FileReader(); 
    $('#addBook div').children('input').each(function(i, el) { 
     if($(el).val() != '') 
     { 
      if(el.id === 'keywords') { 
       formData[ el.id ] = []; 
       _.each($(el).val().split(' '), function(keyword) { 
        formData[ el.id ].push({ 'keyword': keyword }); 
       }); 
      } else if(el.id === 'releaseDate') { 
       formData[ el.id ] = $('#releaseDate').datepicker('getDate').getTime(); 
      } else { 
       formData[ el.id ] = $(el).val(); 
      } 
     } 
    }); 
     console.log(formData); 
     this.collection.create(formData); 
    } 

节点被称为骨干。

//Insert a new book 
app.post('/api/books', function(request, response) { 
    console.log(request.body); 
    console.log(request.files); 
}); 

发送到节点的coverimage的值是正确的,我从来没有在request.files中得到任何东西。我有一个很酷的拖放,我想使用,但直到我得到这个工作,我卡住了。

我试过JQuery文件上传,这让我无处可去。

如果我有头发,我现在就把它拉出来。

+0

http://estebanpastorino.com/2013/09/27/simple-file-uploads-with-backbone-dot-js/ – Joe

回答

0

我也在跟随“开发Backbone.js应用程序”一书的样本,我扩展了将图像上传到服务器中的文件夹并将路径保存在模型中以显示正确图像的功能。它工作正常。我试图使用Plupload和其他jquery插件,但我不喜欢它们。我的示例使用ajax将图像上传到服务器,然后使用它们。我读了很多关于使用iframe来实现Ajax功能的文章。我发现的最佳方法是使用jquery.form.js来避免回发并以很好的方式加载图像。

运行的样品做工精细用的NodeJS:

https://github.com/albertomontellano/bookLibrarySampleNodeJS

我根据我在马克·道森的后的溶液:

http://markdawson.tumblr.com/post/18359176420/asynchronous-file-uploading-using-express-and-node-js

然而,我不得不纠正的方法这篇文章,使其正常工作:

app.post('/api/photos', function(req, res) { 
var responseServerPath = 'images/' + req.files.userPhoto.name; 
var serverPath = 'site/images/' + req.files.userPhoto.name; 
console.log(req.files.userPhoto.path); 
require('fs').rename(
    req.files.userPhoto.path, 
    serverPath, 
    function(error) { 
     if(error) { 
      console.log(error); 
      res.send({ 
       error: 'Ah crap! Something bad happened' 
      }); 
      return; 
     } 

     res.send({ 
      path: responseServerPath 
     }); 
    } 
); 
}); 

我希望它有帮助。

1

我不会将该文件作为model.save/collection.create(model)的一部分提交。

我用的是Plupload用于文件上传管理器,将文件提交给上传处理程序。此上传处理程序要么返回上传文件的路径,要么将参考文件存储在数据库表中。

从那里我填充我的骨干模型中的一个属性,然后坚持模型。您可以让您的模型listenTo plupload,上传完成的事件或类似的。

+0

我对骨干很陌生,我根本弄不清楚如何得到开始。你有任何简单的例子吗?我只需要基本的例子,只需要一个文件上传。以后我可以找出听众,但我无法使上传按钮在骨干网页上工作,而且我不知道如何在用户点击上传时上传文件。 – user2449001

+0

没有我可以提供的“基本”示例,因为我不认为您的文件上传应该通过典型的骨干网同步进行。我的建议是,您需要开发一些功能来上传文件,然后在您的书籍模型上设置对该文件的引用,然后同步该文件。你似乎没有任何困难让你的模型到你的后端,所以你的问题是上传。至于如何组合文件和模型,我已经解释过我以前做过的事情。 – damienc88

+0

这就是为什么我开始这个线程,想出如何获取文件上传。我一直无法通过骨干做出任何进展。我希望得到那方面的帮助,对不起,我不清楚。 – user2449001

-2

原来,我不得不最终聘请某人来做这件事,因为我无法在网上找到任何人通过主干上传文件的例子,即使没有更新任何数据库交互。每个人都有与使用什么工具上传文件相同的基本建议,但我不能在我的生活中找到某个人实施它的例子。

我打算让代码对所有人都可用,以便他们可以看到它是如何工作的。

+0

你可以在这里看到一个工作示例https://github.com/jeffakaufman/rejuvasea.git – user2449001

+0

这个例子不是通过主干上传文件的例子,这是你的问题要求。这是通过JavaScript上传文件的一个例子。 – damienc88