请教一个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端上传图片是没有问题的!
根据你提供的信息,看起来问题可能与文件格式或上传过程中的一些细节有关。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());
}
}
});
解释
-
服务器端:
- 使用
formidable
处理表单数据。 form.parse()
解析请求,并将文件保存到指定路径。- 使用
fs.rename()
将临时文件移动到目标目录。
- 使用
-
客户端:
- 创建
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
)来处理文件上传。