请教一个Nodejs上传问题

请教一个Nodejs上传问题

我在做android应用时需要将crashlog (crash-1388057064989.cr文件)上传至服务器,服务器是用 nodejs 写的 上传一般文件都没问题!就是上传crashlog时会出错?

服务器代码

 var self = this
          , form = new formidable.IncomingForm()
          , uploadedFile
          , savedFile;
      // Handle each part of the multi-part post
      form.onPart = function (part) {
          // Handle each data chunk as data streams in
          part.addListener('data', function (data) {
              // Initial chunk, set the filename and create the FS stream
              if (!uploadedFile) {
                  uploadedFile = encodeURIComponent(part.filename);
                  savedFile = fs.createWriteStream(path.join('public', 'mylog', uploadedFile));
                console.log("000000000"+uploadedFile);
              }
              savedFile.write(data);
          });
          // The part is done
          part.addListener('end', function () {
              var err;
              // If everything went well, close the FS stream
              if (uploadedFile) {
                  savedFile.end();
              }
              // Something went wrong
              else {
                  err = new Error('Something went wrong in the upload.');
                  self.error(err);
              }
          });

报错

Error: Something went wrong in the upload.
at Stream. (/Users/yjl/reekr/nodejs/myblog/crashlog/app/controllers/uploads.js:44:25)
at Stream.EventEmitter.emit (events.js:92:17)
at MultipartParser.parser.onPartEnd (/Users/yjl/reekr/nodejs/myblog/crashlog/node_modules/formidable/lib/incoming_form.js:364:14)
at callback (/Users/yjl/reekr/nodejs/myblog/crashlog/node_modules/formidable/lib/multipart_parser.js:102:31)
at MultipartParser.write (/Users/yjl/reekr/nodejs/myblog/crashlog/node_modules/formidable/lib/multipart_parser.js:260:15)
at IncomingForm.write (/Users/yjl/reekr/nodejs/myblog/crashlog/node_modules/formidable/lib/incoming_form.js:141:34)
at IncomingMessage. (/Users/yjl/reekr/nodejs/myblog/crashlog/node_modules/formidable/lib/incoming_form.js:110:12)
at IncomingMessage.EventEmitter.emit (events.js:95:17)
at IncomingMessage. (_stream_readable.js:746:14)
at IncomingMessage.EventEmitter.emit (events.js:92:17)

请高人指点为下?是不是和这个文件格式有关系? android端上传图片是没有问题的!


3 回复

根据你提供的信息,看起来问题可能与文件格式或上传过程中的一些细节有关。formidable 是一个强大的库,用于处理表单数据,但在处理特定类型的文件(如 .cr 文件)时可能会遇到一些问题。

首先,我们来检查一下你的代码是否正确地处理了文件上传。以下是一个改进后的示例代码,它应该能够更好地处理文件上传:

改进后的服务器代码

var formidable = require('formidable');
var fs = require('fs');

exports.uploadCrashLog = function(req, res) {
    var form = new formidable.IncomingForm();

    form.parse(req, function(err, fields, files) {
        if (err) {
            console.error('Error parsing form:', err);
            return res.status(500).send('Error processing form');
        }

        var oldPath = files.file.path;
        var newPath = __dirname + '/public/mylog/' + files.file.name;

        fs.rename(oldPath, newPath, function(err) {
            if (err) {
                console.error('Error saving file:', err);
                return res.status(500).send('Error saving file');
            }
            res.status(200).send('File uploaded successfully');
        });
    });
};

客户端代码(Android)

确保客户端使用正确的MIME类型上传文件。以下是一个简单的示例:

File crashLogFile = new File("/path/to/crash-1388057064989.cr");
RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), crashLogFile);
Request request = new Request.Builder()
    .url("http://yourserver/upload")
    .post(requestBody)
    .build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        e.printStackTrace();
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if (!response.isSuccessful()) {
            throw new IOException("Unexpected code " + response);
        } else {
            System.out.println(response.body().string());
        }
    }
});

解释

  1. 服务器端:

    • 使用 formidable 处理表单数据。
    • form.parse() 解析请求,并将文件保存到指定路径。
    • 使用 fs.rename() 将临时文件移动到目标目录。
  2. 客户端:

    • 创建 RequestBody 并设置正确的 MIME 类型。
    • 发送 POST 请求并将文件作为请求体发送。

通过这些更改,你应该能够更可靠地处理 .cr 文件的上传。如果仍然出现问题,请检查文件路径、权限和其他可能的错误原因。


我知道原因了,因为文件长度为0

根据你的描述,错误信息显示在处理上传文件的过程中出现了问题。问题可能与文件格式或文件处理逻辑有关。formidable库可以很好地处理大多数文件类型,但你需要确保文件被正确地读取和写入。

以下是优化后的服务器代码示例:

var formidable = require('formidable');
var fs = require('fs');

app.post('/upload-crashlog', function(req, res) {
    var form = new formidable.IncomingForm();

    form.parse(req, function(err, fields, files) {
        if (err) {
            console.error(err);
            return res.status(500).send('Server error');
        }

        var oldPath = files.crashlog.path;
        var newPath = path.join('public', 'mylog', files.crashlog.name);

        fs.rename(oldPath, newPath, function(err) {
            if (err) {
                console.error(err);
                return res.status(500).send('Error saving file');
            }
            res.status(200).send('File uploaded successfully');
        });
    });
});

在这个示例中,我们使用formidable直接解析上传的文件,并将文件重命名到指定路径。这样可以避免手动处理数据流带来的复杂性。

确保客户端上传请求正确设置了Content-Type头,并且文件名在传输过程中没有被编码。如果仍然出现问题,可以尝试检查文件是否完整地传输到了服务器,或者使用其他库(如multer)来处理文件上传。

回到顶部