将具有用户数据的图像从Android上传到Node.js

时间:2018-12-05 09:09:09

标签: android node.js request multipartform-data multipart

我正在尝试发送带有名为DiaryItem的对象的图像。

这是活动中的uploadFile方法。

    RemoteService remoteService = ServiceGenerator.createService(RemoteService.class);

    File file = new File(imgAbsoluthPath);
    RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), file);
    MultipartBody.Part body = MultipartBody.Part.createFormData("upload", file.getName(), reqFile);
    Call<Integer> req = null;
    try {
        RequestBody username = RequestBody.create(MediaType.parse("text/plain; charset=utf-8"), diaryItem.getUsername());
        RequestBody date = RequestBody.create(MediaType.parse("text/plain; charset=utf-8"), diaryItem.getDate());
        RequestBody memo = RequestBody.create(MediaType.parse("text/plain; charset=utf-8"), diaryItem.getMemo());
        RequestBody photoPath = RequestBody.create(MediaType.parse("text/plain; charset=utf-8"), diaryItem.getPhotoPath());
        req = remoteService.insertDiary(body, username, date, memo, photoPath);
        req.enqueue(new Callback<Integer>() {
            @Override
            public void onResponse(Call<Integer> call, Response<Integer> response) {
                Integer result = response.body();
                if (response.isSuccessful() && result != null) {
                    Log.d(TAG, result.toString());
                    if (result == 1) {
                        Toast.makeText(AddEventActivity.this, "다이어리 저장 완료!", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(AddEventActivity.this, "저장 실패!", Toast.LENGTH_SHORT).show();
                    }
                }
                Log.d(TAG, "Got results from server successfully!!!");
            }

            @Override
            public void onFailure(Call<Integer> call, Throwable t) {
                t.printStackTrace();
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        asyncDialog.dismiss();
    }

这是RemoteService.java

@Multipart
@POST("/user/insertDiary")
Call<Integer> insertDiary(@Part MultipartBody.Part file,
                          @Part RequestBody diaryItem);

这是Node.js

var fs = require('fs');
var express = require('express');
var formidable = require('formidable');
var db = require('../db');
var router = express.Router();

router.post("/insertDiary", function(req, res, next){
    console.log("/insertDiary");
    var form = new formidable.IncomingForm();
    var diaryItem = req.body.diaryItem;

    var dir = './routes/images';

    console.log("Folder is "+fs.existsSync(dir));

    if(!fs.existsSync(dir)){
        fs.mkdirSync(dir);
        console.log("Folder created at "+dir);
    }

    console.log("START fileBegin");

    form.on('fileBegin', function (name, file){
        file.path = __dirname + '/images/'+file.name;
        console.log("fileBegin: file.path: "+file.path);
    });

    console.log("START file");
    form.on('file', function(name, file){
        console.log('file: Uploaded ' + file.name);
    });

    console.log("Ok---DB START");
    var sql = "INSERT INTO diary(username, date, memo, photoPath) values(?,?,?,?)";

    console.log(sql);
    console.log("input:"+photoPath);

    db.get().query(sql, input, function(err,result){
        if(err) console.log(JSON.stringify(err, null, 2));
        console.log(JSON.stringify(result, null, 2));
        res.status(200).send(result.affecedRows);
    });
});
module.exports = router;

图片文件上传得很好。

所以,我的问题是How can I send an Object with @Part annotation? and handle it in Node.js?

我尝试了form.parse()。我的结果很好。但是,它有一个异步问题。有人告诉我,我不应该考虑从回调函数中获取任何值。相反,我需要从客户端获取值,或者必须使用async / await或promise。

这三个似乎很难。因此,我放弃了,我想知道是否可以使用@Part从Client获取许多变量或对象。还有RequestBody。

@Part仅接受RequestBody吗?我看过一些示例代码,他们使用了String,不知道它是否有效。

0 个答案:

没有答案