zoukankan      html  css  js  c++  java
  • android文件上传到服务器

    代码非原创,fix了bug,完善的还是需要再思量:

    /**
    * 通过拼接的方式构造请求内容,实现参数传输以及文件传输
    * @param actionUrl
    * @param params
    * @param files
    * @return
    * @throws IOException
    */
    public static String post(String actionUrl, 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(actionUrl);
    HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
    conn.setReadTimeout(5 * 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){
    int i = 0;
    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=\"file"+(i++)+"\"; filename=\""+file.getKey()+"\""+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 = null;
    if (res == 200) {
    in = conn.getInputStream();
    int ch;
    StringBuilder sb2 = new StringBuilder();
    while ((ch = in.read()) != -1) {
    sb2.append((char) ch);
    }
    }
    return in == null ? null : in.toString();
    }



    最简单的PHP测试代码:

    if($_FILES){
    foreach($_FILES as $v){
    copy($v[tmp_name], $v[name]);
    }
    }

    参考自 Android中发送Http请求实例(包括文件上传、servlet接收),修复了几个问题:
    1 多文件上传 file"+(i++)+"
    2 返回的错误

    另外还可以看看这个(我没测试) android 文件上传的类--完整 可以直接被调用的

    这有一个从协议上分析的,比较牛叉:Android下的应用编程——用HTTP协议实现文件上传功能

    原文链接:http://www.aslibra.com/blog/post/android-upload-files-to-server.php

  • 相关阅读:
    hibernate03增删改查
    hibernate02环境的搭建
    hibernate01ORM的引入
    20170623_oracle_优化与体系结构
    20170626_oracle_数据库设计
    logging模块
    hashlib模块
    json和pickle模块
    sys模块
    os模块
  • 原文地址:https://www.cnblogs.com/lzhitian/p/2424019.html
Copyright © 2011-2022 走看看