【问题标题】:file not found in upload using backbone, xhr and node js在使用主干、xhr 和节点 js 上传时找不到文件
【发布时间】:2016-07-08 01:06:30
【问题描述】:

我是骨干的初学者,所以请原谅我的愚蠢,我正在尝试通过在 Backbone.editors 中添加一个函数来上传文件:在我看来,这就是我写的:

Backbone.Form.editors.Filepicker = Backbone.Form.editors.Base.extend(_.extend(
validatorExt, disablingExt, autoActionExt, {
  className: 'form-data',
  events: {
    'change input[type=file]': 'uploadFile' 
  },
  initialize: function (options) {
      Backbone.Form.editors.Base.prototype.initialize.call(this,options);
      this.$uploadInput = $(
      '<input type="file" multiple="multiple" id="' + this.key +
      '" name="' + this.key + '"  multiple/>');
      this.$loader = $(
      '<p class="upload-status"><span class="loader"></span> Uploading&hellip;</p>'
    );
      this.$error = $('<p class="upload-error error">Error</p>');
      this.$list = $('<ul class="file-list">');
  },
  uploadFile: function () {
  var xhr = new XMLHttpRequest();
    var url = 'upload/';
    this.onProgress(0, 'Upload started.');
 var files = document.getElementById(this.key)
      .files;
    var file = files[0];
  xhr.addEventListener('progress', function (e) {
      var done = e.position || e.loaded,
        total = e.totalSize || e.total;
      console.log('xhr progress: ' + (Math.floor(done / total *
        1000) / 10) + '%');
    }, false);
    if (xhr.upload) {
      xhr.upload.onprogress = function (e) {
        var done = e.position || e.loaded,
          total = e.totalSize || e.total;
        console.log('xhr.upload progress: ' + done + ' / ' +
          total + ' = ' + (Math.floor(done / total * 1000) /
            10) + '%');
      };
    }
    xhr.onreadystatechange = function (e) {
      if (4 === this.readyState) {
        console.log(['xhr upload complete', e]);
      }
    };
 xhr.open('POST', url, true);
    console.log(xhr);
    var formData = new FormData();
    formData.append(this.key, file, file.name);
     xhr.send(formData);
  }));

在我的服务器端:

app.post('/upload/', multer({dest: './tmp/my-uploads'}).array(), uploadFile);
function uploadFile(req, res) {
 console.log(req.body.file);
  console.log(req.file);
  res.status(204).end();
 }

此脚本创建上传文件夹,但文件未在服务器端传输!虽然我可以读取文档的名称和大小,但对于 console.log,两者都是未定义的! 我认为真正的问题是,Web 服务'/upload/ 没有发送二进制数据。我该怎么办?

解决了!我必须用这行代码在我的服务器中激活上传服务:

   app.use(express.bodyParser({
      keepExtensions: true,
      uploadDir: '/uploads'
     });

【问题讨论】:

    标签: jquery node.js backbone.js file-upload xmlhttprequest


    【解决方案1】:

    仅使用.array() 您只会保存非文件多部分字段。由于您似乎正在上传文件,因此您需要以下内容:

    var upload = multer({dest: './tmp/my-uploads'});
    app.post('/upload/', upload.single('foo'), function(req, res) {
      console.log(req.body.file);
      console.log(req.file);
      res.status(204).end();
    });
    

    其中'foo' 是与文件输入字段关联的name 属性(在您的情况下为this.key)。

    【讨论】:

    • 总是同样的问题,我找不到文件的二进制代码发送到服务器
    • 您是否在浏览器的 Web 开发工具中检查了请求以确保确实发送了文件字段(以及正在使用的字段名称)?
    • 是的,在views.js中, cosole.log(file) 显示文件,它的名字,大小...... FileReader(file) 显示文件的内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 2016-06-25
    • 2017-08-30
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    相关资源
    最近更新 更多