【问题标题】:Android RestTemplate post multipart/form-data with utf-8Android RestTemplate 使用 utf-8 发布 multipart/form-data
【发布时间】:2016-03-07 14:09:02
【问题描述】:

当我从 android 发布带有 utf-8 内容的 multipart/form-data 时遇到问题。

这是来自我的 AsyncTask 的片段,用于将数据发布到服务器。除 utf 字符串数据外,一切正常。服务器收到“??????????”

RestTemplate restTemplate = new RestTemplate();
FormHttpMessageConverter formConverter = new FormHttpMessageConverter();
//formConverter.setCharset(Charset.forName("UTF8")); // don't works

restTemplate.getMessageConverters().add(formConverter);
restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter());
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());

HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Cookie", "my cookie string");

// don't works
//Charset charset = Charset.forName("UTF8");
//ArrayList<Charset> acceptCharset = new ArrayList<>();
//acceptCharset.add(charset);
//httpHeaders.setAcceptCharset(acceptCharset);

File f = new File(this.caller.mainActivity.getApplicationContext().getCacheDir(), "picture");
f.createNewFile();

OutputStream os = new BufferedOutputStream(new FileOutputStream(f));
caller.mainActivity.capturedBitmap.compress(Bitmap.CompressFormat.PNG, 90, os);
os.close();

MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
map.add("picture", new FileSystemResource(f.getPath()));
map.add("categoryId", "1");
map.add("description", "text with utf-8 content ტესტ . test");

HttpEntity<MultiValueMap<String, Object>> requestDataEntity = new HttpEntity<>(map, httpHeaders);

HttpEntity<HashMap> response = restTemplate.exchange("url.of.server", HttpMethod.POST, requestDataEntity, HashMap.class);

服务器没有问题。我从邮递员那里测试过,服务器可以接收带有 utf-8 内容的 multipart/form-data。

“描述”的服务器值是:“带有utf-8内容的文本????.test”

服务器端 - 路由片段

var express = require('express');

var multer  = require('multer');
var upload = multer({ limits: { fileSize: 2000000, files: 1 }, dest: 'tempFiles/' });

....
....

router.post('/add', app.filters.commons.sessionRequired(),  upload.single('picture'), function (req, res, next) {
    activityBL.add(req, function (error, data) {
        error ? next(error) : res.json(data);
    });
});

....
....

activityBL - 业务逻辑片段

....
....

bl.add = function (req, cb) {

    var file = req.file || null;

    if(!file) {
        cb({errors: [{code: "004", keyword: "PICTURE_REQUIRED"}]}, null);
        return;
    }

    /*
     * retrieve request data
     */
    var requestData = JSON.parse(JSON.stringify(req.body));

    var desc = requestData.description;

    ....
    ....
    ....  
}

【问题讨论】:

  • 你能发布你的服务器端脚本吗?
  • 当然。刚刚编辑了问题。
  • 您是否使用 PHP 进行服务器端脚本编写?
  • 你的IDE编码是什么?
  • 我在服务器端使用 nodejs [Express Framework],在 IDE 使用 IntelIJ

标签: java android utf-8 multipartform-data resttemplate


【解决方案1】:

您可能需要设置标题以显示 utf-8 字符。

header("Content-Type", "application/json; charset=utf-8");

请参考此链接:http://expressjs.com/en/api.html 你会给你更好的主意。

确保您获取的表和数据库也应用 UTF-8 排序规则。

祝你好运..!!

【讨论】:

  • 问题只出在android部分。当我从邮递员发布相同的数据时,它的工作。我认为我在 android 上的 post object headers 有问题
  • 不要在Android端设置任何字符集并尝试一下,希望这样做会起作用
  • 你能发布你编辑的服务器端脚本和android代码
  • 服务器端是一样的。我评论了我从android中删除的行。
  • 你好@GiorgiMaisuradze 你解决了这个问题吗?我有同样的问题:/
猜你喜欢
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多