由于公司决定用app作为显示端,本人自学android半年多几乎都是跟CSDN上的大神学习的~~
为把这份传承的精神延续下去(瞬间高大上),个人总结了一套android与服务器图片的上传下载(第一次发帖,有些代码是网上找的,有些代码是自己写的,这里只是总结下~~不喜勿喷)
一、server端
1,UploadFileServlet上传图片
package com.pic.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Servlet implementation class UploadFileServlet
*/
public class UploadFileServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UploadFileServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html");
PrintWriter out = response.getWriter();
DiskFileItemFactory factory = new DiskFileItemFactory();
String path = "D:\\cxc\\";//上传文件的保存路径
factory.setRepository(new File(path));
factory.setSizeThreshold(1024 * 1024);
ServletFileUpload upload = new ServletFileUpload(factory);
JSONObject jobj = new JSONObject();
try {
List<FileItem> list = (List<FileItem>)upload.parseRequest(request);
for(FileItem item : list){
String name = item.getName();
String fileName = name.substring(name.lastIndexOf("\\") + 1);
InputStream is = item.getInputStream();
File f = new File(path + fileName);
FileOutputStream fos = new FileOutputStream(f);
int hasRead = 0;
byte[] buf = new byte[1024];
while((hasRead = is.read(buf)) > 0){
fos.write(buf, 0, hasRead);
}
fos.close();
is.close();
}
jobj.put("result", 0);
out.print(jobj.toString());
} catch (Exception e1) {
e1.printStackTrace();
try {
jobj.put("result", -1);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.print(jobj.toString());
}
out.flush();
out.close();
}
}
2,DownloadServlet 下载图片,这里用的是图片转字符串,由于没找到tomcat访问动态资源的方法,所以这里还是用图片转字符串形式传递图片数据
package com.pic.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class DownloadServlet
*/
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public DownloadServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/plain; charset=UTF-8");
request.setCharacterEncoding("UTF-8");
String p_id = request.getParameter("pid");
String imgPath = "D:\\cxc\\"+"p_id"+".jpg";
//PicAndString是自己写的方法,负责图片与字符串的相互转化,附上
String getImageStr = PicAndString.GetImageStr(imgPath);
PrintWriter printWriter = response.getWriter();
printWriter.print(getImageStr);
printWriter.flush();
printWriter.close();
}
}
PicAndString
public class PicAndString {
// 图片转化成base64字符串
public static String GetImageStr(String imgPath) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
InputStream in = null;
byte[] data = null;
// 读取图片字节数组
try {
in = new FileInputStream(imgPath);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);// 返回Base64编码过的字节数组字符串
}
// base64字符串转化成图片
public static boolean GenerateImage(String imgStr,String imgFilePath) { // 对字节数组字符串进行Base64解码并生成图片
if (imgStr == null) // 图像数据为空
return false;
BASE64Decoder decoder = new BASE64Decoder();
try {
// Base64解码
byte[] b = decoder.decodeBuffer(imgStr);
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {// 调整异常数据
b[i] += 256;
}
}
// 生成jpeg图片
// String imgFilePath = "D:/test22.jpg";// 新生成的图片
OutputStream out = new FileOutputStream(imgFilePath);
out.write(b);
out.flush();
out.close();
return true;
} catch (Exception e) {
return false;
}
}
}
Android端
1,上传图片,采用的是volley框架,这里上传的是原图
首先用手机拍照,以文件的形式保存到sd卡中(从相册获取略过,很简单)
findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 先验证手机是否有sdcard
String status = Environment.getExternalStorageState();
if (!status.equals(Environment.MEDIA_MOUNTED)) {
Toast.makeText(MainActivity.this, "手机没有sd卡", Toast.LENGTH_SHORT).show();
return;
}
// 创建图片保存路径
File file = new File(Environment.getExternalStorageDirectory() + "/cxcpics");
if (!file.exists()) {
file.mkdirs();
}
// picFile = new File(file,System.currentTimeMillis()+".jpg");
picFile = new File(file, newName);
if (!picFile.exists()) {
try {
picFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
// 调用相机
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(picFile));
startActivityForResult(intent, TAKE_PICTURE);
}
});
上传方法finalUpload
private void finalUpload(){
String temp = System.currentTimeMillis()+"";
File file = new File(Environment.getExternalStorageDirectory() + "/cxcpics/cxc.jpg");
//post请求需要携带的参数
AjaxParams params = new AjaxParams();
//将文件放入参数中
try {
params.put("file", file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
showToast("图片找不到");
return;
}
String url = "http://192.168.1.84:8080/PicWeb/UploadFileServlet";
//post请求,三个参数分别是请求地址、请求参数、请求的回调接口
finalHttp.post(url, params, new AjaxCallBack<String>() {
@Override
public void onFailure(Throwable t, int errorNo, String strMsg) {
super.onFailure(t, errorNo, strMsg);
showToast("上传失败, msg=" + strMsg);
}
@Override
public void onStart() {
super.onStart();
showToast("开始上传");
}
@Override
public void onSuccess(String t) {
super.onSuccess(t);
//根据服务器返回的json数据,判断上传是否成功
if(!TextUtils.isEmpty(t)){
try {
JSONObject obj = new JSONObject(t);
if(obj.optInt("result") == 0){
showToast("上传成功");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
下载图片
private void downLoadPic(){
RequestParams requestParams = new RequestParams();
String id="图片id";
requestParams.add("pid",id);
new AsyncHttpClient()
.post("http://223.202.31.89:8080/Web/PicServlet",
requestParams, new AsyncHttpResponseHandler() {
@Override
public void onFailure(int arg0,
Header[] arg1, byte[] arg2,
Throwable arg3) {
Toast.makeText(
MainActivity.this,
"没有获取到Android服务器端的响应",
Toast.LENGTH_LONG).show();
dialog.dismiss();
}
@Override
public void onSuccess(int statusCode,
Header[] headers,
byte[] responseBody) {
if (statusCode == 200) {
// //返回的字符串
String strR = new String(responseBody);
iv.setImageBitmap(String2Bitmap(strR));
dialog.dismiss();
}
}
});
}
//字符串装换城BitMap
public static Bitmap String2Bitmap(String pic) {
byte[] bytes = Base64.decode(pic, Base64.DEFAULT);
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
return bitmap;
}
有哪地方写的不好,还望大神指定~~~