Android通过Post上传数据和图片到Servlet

之前在做Android服务端客户端Demo的时候,暂时使用的Servlet来从当服务端,这样的话,当我们需要从Android客户端与服务端进行数据交互的时候,需要从客户端上传数据到Servlet.下面是实例代码:

Android上传数据到Servlet代码
                        //用于提交数据的client
                        HttpClient client = new DefaultHttpClient();
                        //这是提交的服务端地址
                        String url = "http://192.168.1.101:8080/FaceServer/JWOKServlet";
                        //采用的是Post方式进行数据的提交
                        HttpPost post = new HttpPost(url);
                        List<NameValuePair> paramsList = new ArrayList<NameValuePair>();

                        //这里就是提交的数据,你在服务端就可以通过request.getParameter("字段名称")

                        paramsList.add(new BasicNameValuePair("id",id));

                        paramsList.add(new BasicNameValuePair("name", name)); 

                        paramsList.add(new BasicNameValuePair("jingdu", jingdu));

                        paramsList.add(new BasicNameValuePair("weidu", weidu));

                        try {
                            post.setEntity(new UrlEncodedFormEntity(paramsList,
                                    HTTP.UTF_8));
                            HttpResponse response = client.execute(post);

                            if (response.getStatusLine().getStatusCode() == 200) {
                                ByteArrayOutputStream outStream = new ByteArrayOutputStream();
                                InputStream in = response.getEntity()
                                        .getContent();
                                byte[] data = new byte[4096];
                                int count = -1;
                                while ((count = in.read(data, 0, 4096)) != -1)
                                    outStream.write(data, 0, count);
                                data = null;

                                //这是服务端返回的数据
                                String content = new String(outStream
                                        .toByteArray(), "utf-8");}
                        catch(Exception ex){
                              }

上面就是Android上传数据到Servlet的代码,其中采用的BasicNameValuePair来进行数据的包装。

Android上传图片到Servlet
public class UploadUtil {
    private static final String TAG = "uploadFile";


    private static final int TIME_OUT = 10 * 1000; 


    private static final String CHARSET = "utf-8"; 




    public static String post(String url, Map<String, String> params, Map<String, File> files)
            throws IOException {
        String BOUNDARY = java.util.UUID.randomUUID().toString();
        String PREFIX = "--", LINEND = "\r\n";
        String MULTIPART_FROM_DATA = "multipart/form-data";
        String CHARSET = "UTF-8";


        URL uri = new URL(url);
        HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
        conn.setReadTimeout(10 * 1000); 
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setUseCaches(false); 
        conn.setRequestMethod("POST");
        conn.setRequestProperty("connection", "keep-alive");
        conn.setRequestProperty("Charsert", "UTF-8");
        conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY);



        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, String> entry : params.entrySet()) {
            sb.append(PREFIX);
            sb.append(BOUNDARY);
            sb.append(LINEND);
            sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND);
            sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);
            sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
            sb.append(LINEND);
            sb.append(entry.getValue());
            sb.append(LINEND);
        }


        DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());
        outStream.write(sb.toString().getBytes());

        if (files != null)
            for (Map.Entry<String, File> file : files.entrySet()) {
                StringBuilder sb1 = new StringBuilder();
                sb1.append(PREFIX);
                sb1.append(BOUNDARY);
                sb1.append(LINEND);
                sb1.append("Content-Disposition: form-data; name=\"uploadfile\"; filename=\""
                        + file.getValue().getName() + "\"" + LINEND);
                sb1.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINEND);
                sb1.append(LINEND);
                outStream.write(sb1.toString().getBytes());


                InputStream is = new FileInputStream(file.getValue());
                byte[] buffer = new byte[1024];
                int len = 0;
                while ((len = is.read(buffer)) != -1) {
                    outStream.write(buffer, 0, len);
                }


                is.close();
                outStream.write(LINEND.getBytes());
            }

       byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
        outStream.write(end_data);
        outStream.flush();

        int res = conn.getResponseCode();
        InputStream in = conn.getInputStream();
        StringBuilder sb2 = new StringBuilder();
        if (res == 200) {
            int ch;
            while ((ch = in.read()) != -1) {
                sb2.append((char) ch);
            }
        }
        outStream.close();
        conn.disconnect();
        return sb2.toString();
    }
}

在上面的代码中,url就是我们服务端用以接受图片的地址,params就是提交的参数集合,files就是我们上传的图片的map,这里也可以是别的文件。

Servlet端用以接受图片的代码

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        response.setCharacterEncoding("utf-8");

        DiskFileItemFactory factory = new DiskFileItemFactory();
        String fileName = "";
        // 获取文件上传需要保存的路径,upload文件夹需存在。
        //这是我本地用以存储图片的文件夹路劲
        String path = "D:\\Face detection\\image";
        // 设置暂时存放文件的存储室,这个存储室可以和最终存储文件的文件夹不同。因为当文件很大的话会占用过多内存所以设置存储室。
        factory.setRepository(new File(path));
        // 设置缓存的大小,当上传文件的容量超过缓存时,就放到暂时存储室。
        factory.setSizeThreshold(1024 * 1024);
        // 上传处理工具类(高水平API上传处理?)
        ServletFileUpload upload = new ServletFileUpload(factory);

        try {
            // 调用 parseRequest(request)方法 获得上传文件 FileItem 的集合list 可实现多文件上传。
            List<FileItem> list = (List<FileItem>) upload.parseRequest(request);
            for (FileItem item : list) {
                // 获取表单属性名字。
                String name = item.getFieldName();

                // 如果获取的表单信息是普通的文本信息。即通过页面表单形式传递来的字符串。
                if (item.isFormField()) {
                    // 获取用户具体输入的字符串,
                    String value = item.getString();
                    request.setAttribute(name, value);
                }
                // 如果传入的是非简单字符串,而是图片,音频,视频等二进制文件。
                else {
                    // 获取路径名
                    String value = item.getName();
                    // 取到最后一个反斜杠。
                    int start = value.lastIndexOf("\\");
                    // 截取上传文件的 字符串名字。+1是去掉反斜杠。
                    String filename = value.substring(start + 1);
                    request.setAttribute(name, filename);

                    /*
                     * 第三方提供的方法直接写到文件中。 item.write(new File(path,filename));
                     */
                    // 收到写到接收的文件中。
                    OutputStream out = new FileOutputStream(new File(path,
                            filename));
                    System.out.println("..........."+filename);
                    fileName = filename;
                    InputStream in = item.getInputStream();

                    int length = 0;
                    byte[] buf = new byte[1024];

                    while ((length = in.read(buf)) != -1) {
                        out.write(buf, 0, length);
                    }
                    in.close();
                    out.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

当然,上面代码要运行成功的话还需要下载这三个jar文件到你的服务端的WEB-INF下面的lib中。这是下载地址:jar包下载地址,密码:7xha

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值