前面我做了一个 用 volley +php 的混合上传程序.如觉如果 用php 顺手的可以用 这个组合很灵活.
只要.用 volley 发送参数,将文件进行 base,base64编码,再给 php 接收就非常方便实现,表单,文件的混合上传
.php 这一点还是非常好用的.
后来我用retrofit2做安卓前端程序,想试一试node.js ,用上了它, 做后台接口,想把用 volley 写的 代码给 node.js直接用 于是遇到点问题.
也许会有人问.怎么不用php 的框架.是阿.可我就是没用.想试一试 js .
volley 的灵活性和简单的地方
也许说这话有些过时了.但是像用过 自动绑定的框架来说 volley 肯定是昨日黄花.
它贵在简单.功能弱鸡了点,不过做调试,演示是个好工具.不用每一个数据都做序列化.
很适合本人这种蹩脚程序员.我也不在乎这些.
现在就来谈谈怎么将表单混合图片文件上传到 node.js 的接口,
用 volley 上传 参数. req.body.文本表单数据肯定是没用问题的.问题都处在
图片文件是个混合编码文件也许直接可以转成 urlencoded 码.可就是不巧
我先写的都是base64.所以.我踩坑了.
- 第一个坑就是 node.js 接收数据的编码问题
public String getBodyContentType() {
return "application/x-www-form-urlencoded";
}.
你传送的参数必需符合 node.js 端收到的数据同等的格式,否则
接收 post 参数 将 undefine 错误,
这个问题在 PHP 根本不存在的. php 自动识别 ,而对于 node.js 必需主动发送
- 第二个坑就是就算你配置了. node.js 端还要开启 模块
var bodyParser = require('body-parser')
//使用 application/x-www-form-urlencoded post 传递属性才有效.
app.use(bodyParser.urlencoded({extended: false})) //(1)
否则也是post 参数无定义.错误
- 文件的urlencoded编码问题, base64 串不认.
大家知道如果采用 string 编码成base,base64,你的发送类型必需是application/x-www-form-urlencoded
但是node.js 死活就 将 imageBase64串.当作 undefine.
String imageDataString=imageToString(bitmap);
params.put("imageBase64",imageDataString);
这样 ,在 node.js 是收不到数据的.因为编码不是 urlencoded
//No-2 调用 图像转化程序
private String imageToString(Bitmap bitmap){
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG,100,outputStream);
byte[] imageBytes=outputStream.toByteArray();
//android.util.Base64
String encodedImageDataString= Base64.encodeToString(imageBytes, android.util.Base64.DEFAULT);
return encodedImageDataString;
}
本来这样 在 php 就行了.php 自动识别.这一点,说明php 还是你大爷.
于是我将 对 base64 在进行一次编码 ,然后在node.js 端再解码一次
try {
imageDataString= URLEncoder.encode(imageDataString, "utf-8");
params.put("imageBase64_URLEncoder",imageDataString);
params.put("uploadProductImageSwitch","on");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
params.put("uploadProductImageSwitch","off");
Toast_Looper("uploadProductImageSwitch错误:"+e.getMessage());
}
let imgData="";
imgData=req.body.imageBase64_URLEncoder;
// console.log("imageData:" + req.body.imageBase64_URLEncoder);
imgData= decodeURIComponent(imgData, 'utf-8');
let base64Data = imgData.replace(/^data:image\/\w+;base64,/, "");
这样.就可以接收到 图片文件的数据了.
-
在调试 node.js 的程序的时候发现.直接 用 webstrom 运行 .js 文件.
将无法正常接收 cookie ,session 数据. 于是我用 hotnode 运行.这个小问题
也算一个不大不小的坑吧 -
node.js 还有一个 传递文本大小的限制,没想这个设置的坑也被我踩了.
const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({limit:'150mb',extended:true}));
这里夸张了点.实际上默认, urlencoded 最大, 100k ,
索性设置大点.等调试做好了再搞小点
这个设置还分位置.不能设置到 路由脚本 .js 文件中
例如
router.use(bodyParser.urlencoded({limit:'150mb',extended:true}));
你说坑爹不坑爹, 这也说明node.js 确实没用php 成熟.
- 而且. node.js 在使用 mysql 模块的时候. 调用数据库查询不分脚本顺序
是同时运行的得到结果是异步的.要同步两个 查询. 必需使用
标记=0
查询1 {
if (结果 ){ 标记=1
}else{
if(标记===0){
查询 2
}
}
查询1.结束
否则 查询 1 和 查询 2 不论脚本顺序都是并发执行的.
例如
标记 =0
查询 1
if(得到结果) 标记 =1
if( 标记===0) {查询2 }
结果 查询2 总是被执行. 或者
你觉得 应该将标记初始化为 1 ,
不过那查询2就总不执行了.