Android前段与后台服务器的图片上传与下载

由于公司决定用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;
    }

有哪地方写的不好,还望大神指定~~~

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值