如何用 volley上传混合文件+表单混合数据到 node.js 后台,urlencoded undefine 错误等踩坑作业.

5 篇文章 0 订阅
4 篇文章 0 订阅

前面我做了一个 用 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.所以.我踩坑了.

  1. 第一个坑就是 node.js 接收数据的编码问题
  public String getBodyContentType() {
                return "application/x-www-form-urlencoded";
            }. 

你传送的参数必需符合 node.js 端收到的数据同等的格式,否则
接收 post 参数 将 undefine 错误,
这个问题在 PHP 根本不存在的. php 自动识别 ,而对于 node.js 必需主动发送

  1. 第二个坑就是就算你配置了. node.js 端还要开启 模块
var bodyParser = require('body-parser')
//使用   application/x-www-form-urlencoded  post 传递属性才有效.
app.use(bodyParser.urlencoded({extended: false}))  //(1)

否则也是post 参数无定义.错误

  1. 文件的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,/, "");

这样.就可以接收到 图片文件的数据了.

  1. 在调试 node.js 的程序的时候发现.直接 用 webstrom 运行 .js 文件.
    将无法正常接收 cookie ,session 数据. 于是我用 hotnode 运行.这个小问题
    也算一个不大不小的坑吧

  2. 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 成熟.

  1. 而且. node.js 在使用 mysql 模块的时候. 调用数据库查询不分脚本顺序
    是同时运行的得到结果是异步的.要同步两个 查询. 必需使用
标记=0
 查询1 {
       if (结果 ){ 标记=1 
       }else{
			 if(标记===0){   
			 			查询 2
			 }
	}
查询1.结束

否则 查询 1 和 查询 2 不论脚本顺序都是并发执行的.

例如

标记 =0
查询 1   
if(得到结果)  标记  =1 
if( 标记===0) {查询2 }

结果 查询2 总是被执行. 或者
你觉得 应该将标记初始化为 1 ,
不过那查询2就总不执行了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值