Androidの画像アップロードサーバ(android側とサービス側)


主な利用技術:
1)volleyフレームワークの改造
2)bitmapによる画像圧縮
3)base 64によりピクチャをバイトストリーム形式で出力する
まずvolleyフレームワークを紹介します.
クリックしてリンクを開く
バックグラウンドデータと対話し、jsonの形でデータを受け入れるには、次の2つのクラスを改造する必要があります.
一つは配列タイプのjsonを受け入れることと、普通のタイプのjsonを受け入れることであり、主な違いはJSOnArrayであり、一つはJSON Arrayであり、一つはJSONである.
1)JSONArray
public class NormalPostRequestArray extends Request {
    private Map mMap;
    private Listener mListener;

    public NormalPostRequestArray(String url, Listener listener, ErrorListener errorListener, Map map) {
        super(Request.Method.POST, url, errorListener);

        mListener = listener;
        mMap = map;
    }

    //mMap          ,        
    @Override
    protected Map getParams() throws AuthFailureError {
        return mMap;
    }

    //    response     json  , JsonObjectRequest     
    @Override
    protected Response 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 {
    private Map mMap;
    private Listener mListener;

    public NormalPostRequest(String url, Listener listener, ErrorListener errorListener, Map map) {
        super(Request.Method.POST, url, errorListener);
        mListener = listener;
        mMap = map;
    }

    //mMap          ,        
    @Override
    protected Map getParams() throws AuthFailureError {
        return mMap;
    }

    //    response     json  , JsonObjectRequest     
    @Override
    protected Response 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);
    }
}

上記の2つのクラスを利用して、ファイルのアップロードを実現し、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 map = new HashMap<>();
            map.put("photo", photo);
            NormalPostRequest normalPostRequest = new NormalPostRequest(url, jsonObjectProductListener, errorListener, map);
            queue.add(normalPostRequest);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

Android側の主な内容はこれらであり,主にvolleyフレームワークを用いてネットワーク伝送を実現し,jsonデータを返すことができればよいが,ピクチャアップロードについては,ピクチャタイプを文字ストリームに変換してバックグラウンドに転送し,バックグラウンドで解析するにすぎない.
では、バックグラウンドコードの主な機能を見てみましょう.
バックグラウンドは主に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 map = new HashMap<>();
		try {
			request.setCharacterEncoding("utf-8");
			response.setCharacterEncoding("utf-8");
			response.setContentType("text/html");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.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 block
			e.printStackTrace();
		}
		return map;
	}

ここで@ResponseBodyは主にデータ、すなわちjson形式の
@RequestMappingは主にクライアントがサーバ側のアドレスにアクセスする
@RequestParam主に渡されたパラメータandroidエンドソース:クリックしてリンクを開く
サービス側ソース:クリックしてリンクを開く