Android基于Http协议实现文件上传功能的方法

Android基于Http协议实现文件上传功能的方法,第1张

概述本文实例讲述了Android基于Http协议实现文件上传功能的方法。分享给大家供大家参考,具体如下:

本文实例讲述了AndroID基于http协议实现文件上传功能的方法。分享给大家供大家参考,具体如下:

注意一般使用http协议上传的文件都比较小,一般是小于2M

这里示例是上传一个小的MP3文件

1.主Activity:MainActivity.java

public class MainActivity extends Activity{  private static final String TAG = "MainActivity";  private EditText timelengthText;  private EditText TitleText;  private EditText vIDeoText;  @OverrIDe  public voID onCreate(Bundle savedInstanceState)  {    super.onCreate(savedInstanceState);    setContentVIEw(R.layout.main);    //提交上传按钮    button button = (button) this.findVIEwByID(R.ID.button);    timelengthText = (EditText) this.findVIEwByID(R.ID.timelength);    vIDeoText = (EditText) this.findVIEwByID(R.ID.vIDeo);    TitleText = (EditText) this.findVIEwByID(R.ID.Title);    button.setonClickListener(new VIEw.OnClickListener()    {      @OverrIDe      public voID onClick(VIEw v)      {        String Title = TitleText.getText().toString();        String timelength = timelengthText.getText().toString();        Map<String,String> params = new HashMap<String,String>();        params.put("method","save");        params.put("Title",Title);        params.put("timelength",timelength);        try        {          //得到SDCard的目录          file uploadfile = new file(Environment.getExternalStorageDirectory(),vIDeoText.getText().toString());          //上传音频文件          Formfile formfile = new Formfile("02.mp3",uploadfile,"vIDeo","audio/mpeg");          SockethttpRequester.post("http://192.168.1.100:8080/vIDeoweb/vIDeo/manage.do",params,formfile);          Toast.makeText(MainActivity.this,R.string.success,1).show();        }        catch (Exception e)        {          Toast.makeText(MainActivity.this,R.string.error,1).show();          Log.e(TAG,e.toString());        }      }    });  }}

2.上传工具类,注意里面构造协议字符串需要根据不同的提交表单来处理

public class SockethttpRequester{  /**   * 发送xml数据   * @param path 请求地址   * @param xml xml数据   * @param enCoding 编码   * @return   * @throws Exception   */  public static byte[] postXml(String path,String xml,String enCoding) throws Exception{    byte[] data = xml.getBytes(enCoding);    URL url = new URL(path);    httpURLConnection conn = (httpURLConnection)url.openConnection();    conn.setRequestMethod("POST");    conn.setDoOutput(true);    conn.setRequestProperty("Content-Type","text/xml; charset="+ enCoding);    conn.setRequestProperty("Content-Length",String.valueOf(data.length));    conn.setConnectTimeout(5 * 1000);    OutputStream outStream = conn.getoutputStream();    outStream.write(data);    outStream.flush();    outStream.close();    if(conn.getResponseCode()==200){      return readStream(conn.getinputStream());    }    return null;  }  /**   * 直接通过http协议提交数据到服务器,实现如下面表单提交功能:   *  <FORM METHOD=POST ACTION="http://192.168.0.200:8080/ssi/fileload/test.do" enctype="multipart/form-data">      <input TYPE="text" name="name">      <input TYPE="text" name="ID">      <input type="file" name="imagefile"/>      <input type="file" name="zip"/>     </FORM>   * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,   *         因为它会指向手机模拟器,你可以使用http://www.baIDu.com或http://192.168.1.10:8080这样的路径测试)   * @param params 请求参数 key为参数名,value为参数值   * @param file 上传文件   */  public static boolean post(String path,Map<String,String> params,Formfile[] files) throws Exception  {    //数据分隔线    final String BOUNDARY = "---------------------------7da2137580612";    //数据结束标志"---------------------------7da2137580612--"    final String endline = "--" + BOUNDARY + "--/r/n";    //下面两个for循环都是为了得到数据长度参数,依据表单的类型而定    //首先得到文件类型数据的总长度(包括文件分割线)    int fileDataLength = 0;    for(Formfile uploadfile : files)    {      StringBuilder fileExplain = new StringBuilder();      fileExplain.append("--");      fileExplain.append(BOUNDARY);      fileExplain.append("/r/n");      fileExplain.append("Content-disposition: form-data;name=/""+ uploadfile.getParametername()+"/";filename=/""+ uploadfile.getFilname() + "/"/r/n");      fileExplain.append("Content-Type: "+ uploadfile.getContentType()+"/r/n/r/n");      fileExplain.append("/r/n");      fileDataLength += fileExplain.length();      if(uploadfile.getInStream()!=null){        fileDataLength += uploadfile.getfile().length();      }else{        fileDataLength += uploadfile.getData().length;      }    }    //再构造文本类型参数的实体数据    StringBuilder textEntity = new StringBuilder();    for (Map.Entry<String,String> entry : params.entrySet())    {      textEntity.append("--");      textEntity.append(BOUNDARY);      textEntity.append("/r/n");      textEntity.append("Content-disposition: form-data; name=/""+ entry.getKey() + "/"/r/n/r/n");      textEntity.append(entry.getValue());      textEntity.append("/r/n");    }    //计算传输给服务器的实体数据总长度(文本总长度+数据总长度+分隔符)    int dataLength = textEntity.toString().getBytes().length + fileDataLength + endline.getBytes().length;    URL url = new URL(path);    //默认端口号其实可以不写    int port = url.getPort()==-1 ? 80 : url.getPort();    //建立一个Socket链接    Socket socket = new Socket(InetAddress.getByname(url.getHost()),port);    //获得一个输出流(从AndroID流到web)    OutputStream outStream = socket.getoutputStream();    //下面完成http请求头的发送    String requestmethod = "POST "+ url.getPath()+" http/1.1/r/n";    outStream.write(requestmethod.getBytes());    //构建accept    String accept = "Accept: image/gif,image/jpeg,image/pjpeg,application/x-shockwave-flash,application/xaml+xml,application/vnd.ms-xpsdocument,application/x-ms-xbap,application/x-ms-application,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/*/r/n";    outStream.write(accept.getBytes());    //构建language    String language = "Accept-Language: zh-CN/r/n";    outStream.write(language.getBytes());    //构建ContentType    String ContentType = "Content-Type: multipart/form-data; boundary="+ BOUNDARY+ "/r/n";    outStream.write(ContentType.getBytes());    //构建contentlength    String contentlength = "Content-Length: "+ dataLength + "/r/n";    outStream.write(contentlength.getBytes());    //构建alive    String alive = "Connection: Keep-Alive/r/n";    outStream.write(alive.getBytes());    //构建host    String host = "Host: "+ url.getHost() +":"+ port +"/r/n";    outStream.write(host.getBytes());    //写完http请求头后根据http协议再写一个回车换行    outStream.write("/r/n".getBytes());    //把所有文本类型的实体数据发送出来    outStream.write(textEntity.toString().getBytes());    //把所有文件类型的实体数据发送出来    for(Formfile uploadfile : files)    {      StringBuilder fileEntity = new StringBuilder();      fileEntity.append("--");      fileEntity.append(BOUNDARY);      fileEntity.append("/r/n");      fileEntity.append("Content-disposition: form-data;name=/""+ uploadfile.getParametername()+"/";filename=/""+ uploadfile.getFilname() + "/"/r/n");      fileEntity.append("Content-Type: "+ uploadfile.getContentType()+"/r/n/r/n");      outStream.write(fileEntity.toString().getBytes());      //边读边写      if(uploadfile.getInStream()!=null)      {        byte[] buffer = new byte[1024];        int len = 0;        while((len = uploadfile.getInStream().read(buffer,1024))!=-1)        {          outStream.write(buffer,len);        }        uploadfile.getInStream().close();      }      else      {        outStream.write(uploadfile.getData(),uploadfile.getData().length);      }      outStream.write("/r/n".getBytes());    }    //下面发送数据结束标志,表示数据已经结束    outStream.write(endline.getBytes());    BufferedReader reader = new BufferedReader(new inputStreamReader(socket.getinputStream()));    //读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败    if(reader.readline().indexOf("200")==-1)    {      return false;    }    outStream.flush();    outStream.close();    reader.close();    socket.close();    return true;  }  /**   * 提交数据到服务器   * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.baIDu.com或http://192.168.1.10:8080这样的路径测试)   * @param params 请求参数 key为参数名,Formfile file) throws Exception  {    return post(path,new Formfile[]{file});  }  /**   * 提交数据到服务器   * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.baIDu.com或http://192.168.1.10:8080这样的路径测试)   * @param params 请求参数 key为参数名,value为参数值   * @param encode 编码   */  public static byte[] postFromhttpClIEnt(String path,String encode) throws Exception  {    //用于存放请求参数    List<nameValuePair> formparams = new ArrayList<nameValuePair>();    for(Map.Entry<String,String> entry : params.entrySet())    {      formparams.add(new BasicnameValuePair(entry.getKey(),entry.getValue()));    }    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams,encode);    httpPost httppost = new httpPost(path);    httppost.setEntity(entity);    //看作是浏览器    httpClIEnt httpclIEnt = new DefaulthttpClIEnt();    //发送post请求    httpResponse response = httpclIEnt.execute(httppost);    return readStream(response.getEntity().getContent());  }  /**   * 发送请求   * @param path 请求路径   * @param params 请求参数 key为参数名称 value为参数值   * @param encode 请求参数的编码   */  public static byte[] post(String path,String encode) throws Exception  {    //String params = "method=save&name="+ URLEncoder.encode("老毕","UTF-8")+ "&age=28&";//需要发送的参数    StringBuilder parambuilder = new StringBuilder("");    if(params!=null && !params.isEmpty())    {      for(Map.Entry<String,String> entry : params.entrySet())      {        parambuilder.append(entry.getKey()).append("=")          .append(URLEncoder.encode(entry.getValue(),encode)).append("&");      }      parambuilder.deleteCharat(parambuilder.length()-1);    }    byte[] data = parambuilder.toString().getBytes();    URL url = new URL(path);    httpURLConnection conn = (httpURLConnection)url.openConnection();    //设置允许对外发送请求参数    conn.setDoOutput(true);    //设置不进行缓存    conn.setUseCaches(false);    conn.setConnectTimeout(5 * 1000);    conn.setRequestMethod("POST");    //下面设置http请求头    conn.setRequestProperty("Accept","image/gif,*/*");    conn.setRequestProperty("Accept-Language","zh-CN");    conn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 8.0; windows NT 5.2; TrIDent/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");    conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");    conn.setRequestProperty("Content-Length",String.valueOf(data.length));    conn.setRequestProperty("Connection","Keep-Alive");    //发送参数    DataOutputStream outStream = new DataOutputStream(conn.getoutputStream());    outStream.write(data);//把参数发送出去    outStream.flush();    outStream.close();    if(conn.getResponseCode()==200)    {      return readStream(conn.getinputStream());    }    return null;  }  /**   * 读取流   * @param inStream   * @return 字节数组   * @throws Exception   */  public static byte[] readStream(inputStream inStream) throws Exception  {    ByteArrayOutputStream outSteam = new ByteArrayOutputStream();    byte[] buffer = new byte[1024];    int len = -1;    while( (len=inStream.read(buffer)) != -1)    {      outSteam.write(buffer,len);    }    outSteam.close();    inStream.close();    return outSteam.toByteArray();  }}public class StreamTool{  /**   * 从输入流读取数据   * @param inStream   * @return   * @throws Exception   */  public static byte[] readinputStream(inputStream inStream) throws Exception{    ByteArrayOutputStream outSteam = new ByteArrayOutputStream();    byte[] buffer = new byte[1024];    int len = 0;    while( (len = inStream.read(buffer)) !=-1 ){      outSteam.write(buffer,len);    }    outSteam.close();    inStream.close();    return outSteam.toByteArray();  }}/** * 使用JavaBean封装上传文件数据 * */public class Formfile{  //上传文件的数据  private byte[] data;  private inputStream inStream;  private file file;  //文件名称  private String filname;  //请求参数名称  private String parametername;  //内容类型  private String ContentType = "application/octet-stream";  /**   * 上传小文件,把文件数据先读入内存   * @param filname   * @param data   * @param parametername   * @param ContentType   */  public Formfile(String filname,byte[] data,String parametername,String ContentType)  {    this.data = data;    this.filname = filname;    this.parametername = parametername;    if(ContentType!=null) this.ContentType = ContentType;  }  /**   * 上传大文件,一边读文件数据一边上传   * @param filname   * @param file   * @param parametername   * @param ContentType   */  public Formfile(String filname,file file,String ContentType)  {    this.filname = filname;    this.parametername = parametername;    this.file = file;    try    {      this.inStream = new fileinputStream(file);    }    catch (fileNotFoundException e)    {      e.printstacktrace();    }    if(ContentType!=null) this.ContentType = ContentType;  }  public file getfile()  {    return file;  }  public inputStream getInStream()  {    return inStream;  }  public byte[] getData()  {    return data;  }  public String getFilname()  {    return filname;  }  public voID setFilname(String filname)  {    this.filname = filname;  }  public String getParametername()  {    return parametername;  }  public voID setParametername(String parametername)  {    this.parametername = parametername;  }  public String getContentType()  {    return ContentType;  }  public voID setContentType(String ContentType)  {    this.ContentType = ContentType;  }}

更多关于AndroID相关内容感兴趣的读者可查看本站专题:《Android文件 *** 作技巧汇总》、《Android *** 作SQLite数据库技巧总结》、《Android *** 作json格式数据技巧总结》、《Android数据库 *** 作技巧总结》、《Android编程之activity *** 作技巧总结》、《Android编程开发之SD卡 *** 作方法汇总》、《Android开发入门与进阶教程》、《Android资源 *** 作技巧汇总》、《Android视图View技巧总结》及《Android控件用法总结》

希望本文所述对大家AndroID程序设计有所帮助。

总结

以上是内存溢出为你收集整理的Android基于Http协议实现文件上传功能的方法全部内容,希望文章能够帮你解决Android基于Http协议实现文件上传功能的方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1141360.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存