如何使用Java在nodejs服务器上上传文件? (REST API)

时间:2015-11-05 13:57:00

标签: java node.js file express upload

这是我的Java代码,用于将文件上传到Node.js服务器。

import java.io.File;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.util.EntityUtils;


public class PostFile {
    public static void main(String[] args) throws Exception {
        HttpClient httpclient = new DefaultHttpClient();
        httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);

        HttpPost httppost = new HttpPost("http://127.0.0.1/upload");
        File file = new File("/Users/KHC/test.txt");

        MultipartEntity mpEntity = new MultipartEntity();

        ContentBody cbFile = new FileBody(file);
        mpEntity.addPart("userfile", cbFile);



        httppost.setEntity(mpEntity);
        System.out.println("executing request " + httppost.getRequestLine());
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity resEntity = response.getEntity();

        System.out.println(response.getStatusLine());
        if (resEntity != null) {
            System.out.println(EntityUtils.toString(resEntity));
        }if (resEntity != null) {
            resEntity.consumeContent();
        }

        httpclient.getConnectionManager().shutdown();
    }
}

这是Node.js代码。我在Node.js服务器上使用express框架。

var fs = require('fs');


module.exports = function(app) {


app.get('/',function(req,res){
    res.end("Node-File-Upload");

});
app.post('/upload', function(req, res) {
    console.log(req.files);
    //console.log(req.files.userfile.originalFilename);
    //console.log(req.files.userfile.path);
    fs.readFile(req.files.userfile.path, function (err, data){
    var dirname = "/workspace/museek-server";
    var newPath = dirname + "/uploads/" +   req.files.image.originalFilename;
    fs.writeFile(newPath, data, function (err) {
    if(err){
    res.json({'response':"Error"});
    }else {
    res.json({'response':"Saved"});
}
});
});
});
};

当我执行Java代码时,Node.js服务器无法读取req.files,因为req.files未定义。我认为还有另一种方法可以读取多部分文件,但我无法在Internet上找到它。谁能帮我这个?

1 个答案:

答案 0 :(得分:0)

在Express 4+版本上已删除

req.files

  

在Express 4中,默认情况下req.files在req对象上不再可用。要访问req.files对象上的上传文件,请使用多部分处理中间件,如busboy,multer,formidable,multiparty,connect-multiparty或pez。

Express Documentation

您可以替换NodeJS代码以使用busboy作为解析器。

关注busboy code samples

可能你的最终解决方案会这样结束:

var express = require('express');
var app = express();

var Busboy = require('busboy'),
    path = require('path'),
    fs = require('fs'); 

app.post('/upload', function(req, res)  {
    var busboy = new Busboy({ headers : req.headers });

    busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
        var dirname = "/workspace/museek-server";
        var newPath = dirname + "/uploads/";
        var saveTo = path.join(newPath, path.basename(fieldname));
        file.pipe(fs.createWriteStream(saveTo));
    });

    busboy.on('finish', function() {
      res.writeHead(200, { 'Response': 'Saved' });
      res.end("That's all folks!");
    });

    return req.pipe(busboy);
});