需求:
完成一个注册页面,要求可以上传头像。
遇到的问题:
1、对于kotlin中访问Android图片库的方法并不熟悉;
2、对于bitmap图像处理的方法并不清除;
3、基于虚拟机的桥接方式,尝试多次依然失败;
4、nodejs-express端对于multidata-from类型数据的解析方式并不熟悉;
5、对于nodejs-express静态资源的访问;
解决问题:
问题1、2,在多方查询资料之后,了解了kotlin当中访问图片库的方法,这里给出替代吗和注释以供备份。
Photo.setOnClickListener { /** * 通过intent方法来传递需要获取的文件信息 */ val intent = Intent() intent.action = Intent.ACTION_GET_CONTENT
intent.type = "image/*" startActivityForResult(intent, 111) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { /** * 重载函数,依据resultCode的值来处理获得数据 * resultCode的值由自己设定,可以前后对应即可 */ super.onActivityResult(requestCode, resultCode, data) when (requestCode) { 111 -> { /** * 由于Data传回的是一个uri值,所以需要通过这个值来获取对应的图片信息 * 以下代码参考自网络 */ bitmap = MediaStore.Images.Media.getBitmap( this.getContentResolver(), data?.data); /** * 通过resizeImage压缩图片 * 其中涉及到dp单位到px单位的转换运算 * 由于在前端布局使用的是dp,而对于图片使用的是像素单位的压缩运算 * 所以需要进行换算 */ bitmap = resizeImage(bitmap, 150 * this.resources.displayMetrics.density, 150 * this.resources.displayMetrics.density) Photo.setImageBitmap(bitmap) } } } fun resizeImage(bitmap: Bitmap, Float, height: Float): Bitmap { val bmpWidth = bitmap.width val bmpHeight = bitmap.height val scaleWidth = width.toFloat() / bmpWidth val scaleHeight = height.toFloat() / bmpHeight val matrix = Matrix() matrix.postScale(scaleWidth, scaleHeight) return Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true) }
3、虚拟机的桥接过程
由于对于桥接模式的具体原理并不清楚,一直认为此时虚拟需要访问的主机ip是‘10.0.2.2’
但是实际上无法使用,最后参看了官方的文档,在终端中使用netcfg命令获得了当前Android虚拟机的ip
但是在获得IP之后,发现虚拟机无法ping通主机,而主机可以ping通虚拟机,说明本机防火墙未关闭
尝试之后,问题成功解决。
4、nodejs-express对于multidata-from的数据解析
查询资料之后,得知了‘formiable’这个中间件,于是对于使用方法进行了学习,以下给出代码。
//创建套件 var form = new formidable.IncomingForm(); //设置文件上传存放地址,在这里配置了本地文件的默认保存位置, //此时文件名称是一个upload开头的随机字符串 form.uploadDir = "./uploads"; //执行里面的回调函数的时候,表单已经全部接收完毕了。 form.parse(req, function(err, fields, files) { for(key in files) { /** 遍历整个文件对象,将upload——XXXX格式的文件名称修改为自己需要的名称 在这里由于我在前端中传回了一个名称,所有就修改为这个名称 **/ let file = files[key] fs.rename('.//'+file['path'], './/uploads//' + file['name'], err=>{ if(err) console.log(err) }) } });
5、nodejs-express静态资源的访问
这个问题在很久之前就已经碰到过,但是对于具体的代码还是不太熟悉,这里给出记录。
app.use('/uploads',express.static('./uploads')); 第一个参数表示路由地址 第二个参数表示本地文件夹的路径