Android中图片上传服务器(android端和服务端)
来源:互联网 发布:天刀捏脸男数据网盘 编辑:程序博客网 时间:2024/05/17 08:17
主要利用技术:
1)volley框架的改造
2)利用bitmap进行将图片进行压缩
3)利用base64将图片进行以字节流的形式进行输出
首先介绍一下volley框架:
点击打开链接
想要和后台数据交互,并以json的形式进行接受数据,就需要进行改造,下面两个类中,
一个是接受数组类型的json,以及就是接受普通类型的json,主要区别就是一个是JSONArray,一个是JSON
1)JSONArray
public class NormalPostRequestArray extends Request<JSONArray> { private Map<String,String> mMap; private Listener<JSONArray> mListener; public NormalPostRequestArray(String url, Listener<JSONArray> listener, ErrorListener errorListener, Map<String,String> map) { super(Request.Method.POST, url, errorListener); mListener = listener; mMap = map; } //mMap是已经按照前面的方式,设置了参数的实例 @Override protected Map<String,String> getParams() throws AuthFailureError { return mMap; } //此处因为response返回值需要json数据,和JsonObjectRequest类一样即可 @Override protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success(new JSONArray(jsonString), HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JSONException je) { return Response.error(new ParseError(je)); } } @Override protected void deliverResponse(JSONArray response) { mListener.onResponse(response); }}2)JSONOBejct
public class NormalPostRequest extends Request<JSONObject> { private Map<String,String> mMap; private Listener<JSONObject> mListener; public NormalPostRequest(String url, Listener<JSONObject> listener, ErrorListener errorListener, Map<String,String> map) { super(Request.Method.POST, url, errorListener); mListener = listener; mMap = map; } //mMap是已经按照前面的方式,设置了参数的实例 @Override protected Map<String,String> getParams() throws AuthFailureError { return mMap; } //此处因为response返回值需要json数据,和JsonObjectRequest类一样即可 @Override protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JSONException je) { return Response.error(new ParseError(je)); } } @Override protected void deliverResponse(JSONObject response) { mListener.onResponse(response); }}
利用上面两个类,来实现文件上传,并返回json数据
核心代码
public void load(Bitmap photodata) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); //将bitmap一字节流输出 Bitmap.CompressFormat.PNG 压缩格式,100:压缩率,baos:字节流 photodata.compress(Bitmap.CompressFormat.PNG, 100, baos); baos.close(); byte[] buffer = baos.toByteArray(); System.out.println("图片的大小:"+buffer.length); //将图片的字节流数据加密成base64字符输出 String photo = Base64.encodeToString(buffer, 0, buffer.length,Base64.DEFAULT); String url = Url.url("/androidUser/imageUpload"); RequestQueue queue = Volley.newRequestQueue(context); Map<String, String> map = new HashMap<>(); map.put("photo", photo); NormalPostRequest normalPostRequest = new NormalPostRequest(url, jsonObjectProductListener, errorListener, map); queue.add(normalPostRequest); } catch (Exception e) { e.printStackTrace(); } }
好了 ,看一下后台代码的主要功能实现
后台我主要是利用springmvc进行的开发,当然,转换成struts是非常简单的,大家可以自己去练习
@ResponseBody@RequestMapping(value = "/imageUpload")public Object imageUpload(@RequestParam(value = "photo") String photo, @RequestParam(value = "phoneNumber") String phoneNumber, HttpServletRequest request, HttpServletResponse response) throws IllegalStateException, IOException {User user = userService.checkPhone(phoneNumber);Map<String, Object> map = new HashMap<>();try {request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");response.setContentType("text/html");} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {// 对base64数据进行解码 生成 字节数组,不能直接用Base64.decode();进行解密byte[] photoimg = new BASE64Decoder().decodeBuffer(photo);for (int i = 0; i < photoimg.length; ++i) {if (photoimg[i] < 0) {// 调整异常数据photoimg[i] += 256;}}// 获取项目运行路径String pathRoot = request.getSession().getServletContext().getRealPath("");// 生成uuid作为文件名称String uuid = UUID.randomUUID().toString().replaceAll("-", "");String path = "/images/" + uuid + "head.png";// byte[] photoimg =// Base64.decode(photo);//此处不能用Base64.decode()方法解密,我调试时用此方法每次解密出的数据都比原数据大// 所以用上面的函数进行解密,在网上直接拷贝的,花了好几个小时才找到这个错误(菜鸟不容易啊)System.out.println("图片的大小:" + photoimg.length);File file = new File(pathRoot + path);if (!file.exists()) {file.createNewFile();}FileOutputStream out = new FileOutputStream(file);out.write(photoimg);out.flush();out.close();//设置数据user.setHeadPortrait(path);user.setUpdateTime(new Date());System.out.println(user);if (userService.update(user) != 0) {map.put("updateImage", "success");map.put("imageUrl", path);} else {map.put("updateImage", "filed");}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return map;}
@RequestMappping主要是客户端访问服务器端的地址
@RequestParam主要是传递的参数
android端源码:点击打开链接
服务端源码:点击打开链接
0 0
- Android中图片上传服务器(android端和服务端)
- Android上传图片到服务器的代码怎么写(Android客户端代码和服务端代码)
- android端上传图片到服务端
- android上传图片到javaweb服务端,android+和struts2
- Android图片上传的客户端和服务端代码
- Android头像上传和java服务端接收图片。
- Android中向服务器上传图片
- Android中上传图片到服务器详解
- android图片上传服务器
- Android上传图片和文字到服务器
- android上传图片和参数(属性)到服务器
- android-HttpClient上传信息(包括图片)到服务端
- android-HttpClient上传信息(包括图片)到服务端
- Android如何压缩图片上传服务端
- Android上传图片至服务器Servlet端
- Android 上传图片到服务器(PHP)
- Android上传图片至服务器
- Android上传图片至服务器
- CSS 相对|绝对(relative/absolute)定位系列 鑫
- 使用IntelliJ IDEA开发SpringMVC网站(三)数据库配置
- Codeforces Round #366 题解
- [Offer收割]编程练习赛4
- java Map List和Set区别
- Android中图片上传服务器(android端和服务端)
- Spring mvc+freeMarker 使用jsp自定义标签
- 04#数据分析-R基础(1)
- 【测试】Alpha测试/Beta测试/验收测试的区别
- 【多校训练】ZZULIOJ 1893 985的数学难题【位运算】
- Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushM
- 二叉树的建立♪♬♫(先序,前中,中后)
- JSTL标签使用
- 关于QT UDP组播的两个问题