Androidの画像アップロードサーバ(android側とサービス側)
6608 ワード
主な利用技術:
1)volleyフレームワークの改造
2)bitmapによる画像圧縮
3)base 64によりピクチャをバイトストリーム形式で出力する
まずvolleyフレームワークを紹介します.
クリックしてリンクを開く
バックグラウンドデータと対話し、jsonの形でデータを受け入れるには、次の2つのクラスを改造する必要があります.
一つは配列タイプのjsonを受け入れることと、普通のタイプのjsonを受け入れることであり、主な違いはJSOnArrayであり、一つはJSON Arrayであり、一つはJSONである.
1)JSONArray
上記の2つのクラスを利用して、ファイルのアップロードを実現し、jsonデータを返します.
コアコード
Android側の主な内容はこれらであり,主にvolleyフレームワークを用いてネットワーク伝送を実現し,jsonデータを返すことができればよいが,ピクチャアップロードについては,ピクチャタイプを文字ストリームに変換してバックグラウンドに転送し,バックグラウンドで解析するにすぎない.
では、バックグラウンドコードの主な機能を見てみましょう.
バックグラウンドは主にspringmvcを利用して開発しています.もちろん、strutsに変換するのはとても簡単です.皆さんは自分で練習することができます.
ここで@ResponseBodyは主にデータ、すなわちjson形式の
@RequestMappingは主にクライアントがサーバ側のアドレスにアクセスする
@RequestParam主に渡されたパラメータ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エンドソース:クリックしてリンクを開く
サービス側ソース:クリックしてリンクを開く