Android Http实现文件的上传和下载

Android Http实现文件的上传和下载,第1张

概述最近做一个项目,其中涉及到文件上传下载功能,大家都知道,这个功能实现其实已经烂大街了,遂、直接从网上荡了一堆代码用,结果,发现网上的代码真是良莠不齐,不是写的不全面,就是有问题,于是自己重新整理了

最近做一个项目,其中涉及到文件的上传和下载功能,大家都知道,这个功能实现其实已经烂大街了,遂、直接从网上荡了一堆代码用,结果,发现网上的代码真是良莠不齐,不是写的不全面,就是有问题,于是自己重新整理了一番,把它们发出来,希望更多人能受用。

文件上传

通过org.apache.commons.httpclIEnt.httpClIEnt来实现文件上传,该jar包可以直接从网上所搜、下载。

  /**   * @param mContext 上下文   * @param targetUrl 文件上传地址   * @param filePath 文件路径   */  public voID uploadfile(final Activity mContext,String targetUrl,final String filePath) {    System.out.println("targetUrl: " + targetUrl + " filePath: " + filePath);    if (TextUtils.isEmpty(filePath)) {      Toast.makeText(mContext,"文件不存在",Toast.LENGTH_SHORT).show();      return;    }    final PostMethod filePost = new PostMethod(targetUrl) {//这个用来中文乱码      public String getRequestCharSet() {        return "UTF-8";      }    };    try {      final httpClIEnt clIEnt = new httpClIEnt();      file file = new file(filePath);      if (file.exists() && file.isfile()) {        long fileSize = file.length();        if (fileSize >= 5 * 1024 * 1024) {          Toast.makeText(mContext,"文件不得大于5M",Toast.LENGTH_SHORT).show();          return;        }      } else {        Toast.makeText(mContext,Toast.LENGTH_SHORT).show();        return;      }      // 上传文件和参数      Part[] parts = new Part[]{new CustomfilePart(file.getname(),file),new StringPart("filename",file.getname(),"UTF-8")};      filePost.setRequestEntity(new MultipartRequestEntity(parts,filePost.getParams()));      new Thread(new Runnable() {        @OverrIDe        public voID run() {          int statuscode = 0;          try {            statuscode = clIEnt.executeMethod(filePost);          } catch (IOException e) {            e.printstacktrace();          }          final int finalStatuscode = statuscode;          mContext.runOnUiThread(new Runnable() {            @OverrIDe            public voID run() {              if (finalStatuscode == httpStatus.SC_OK) {                Toast.makeText(mContext,"上传成功",Toast.LENGTH_SHORT).show();              } else {                Toast.makeText(mContext,"上传失败",Toast.LENGTH_SHORT).show();              }            }          });        }      }).start();    } catch (Exception ex) {      ex.printstacktrace();    }  }

httpClIEnt的使用,常常会遇到乱码问题,我们主要在两个地方解决乱码问题:
 •复写PostMethod 的getRequestCharSet,指定请求编码

 final PostMethod filePost = new PostMethod(targetUrl) {//这个用来中文乱码      public String getRequestCharSet() {        return "UTF-8";      }    };

 •自定义filePart,指定请求参数编码

 /** * 解决中文文件名乱码 */public class CustomfilePart extends filePart {  public CustomfilePart(String filename,file file)      throws fileNotFoundException {    super(filename,file);  }  protected voID senddispositionheader(OutputStream out) throws IOException {    super.senddispositionheader(out);    String filename = getSource().getfilename();    if (filename != null) {      out.write(EnCodingUtil.getAsciiBytes(file_name));      out.write(QUOTE_BYTES);      out.write(EnCodingUtil.getBytes(filename,"UTF-8"));      out.write(QUOTE_BYTES);    }  }}

使用CustomfilePart添加参数:

Part[] parts = new Part[]{new CustomfilePart(file.getname(),"UTF-8")};filePost.setRequestEntity(new MultipartRequestEntity(parts,filePost.getParams()));

文件下载

通过httpURLConnection下载文件。

  /**   * @param urlStr  文件地址   * @param path   文件保存路径   * @param filename 文件名   * @return 文件的绝对路径   */  public String downfile(String urlStr,String path,String filename) {    inputStream inputStream = null;    String filePath = null;    try {      fileUtils fileUtils = new fileUtils();      //判断文件是否存在      if (fileUtils.isfileExist(path + filename)) {        System.out.println("exits");        filePath = Sdpath + path + filename;      } else {        //得到io流        inputStream = getinputStreamFromURL(urlStr);        //从input流中将文件写入SD卡中        file resultfile = fileUtils.write2SDFrominput(path,filename,inputStream);        if (resultfile != null) {          filePath = resultfile.getPath();        }      }    } catch (Exception e) {      e.printstacktrace();    } finally {      try {        if (inputStream != null)          inputStream.close();      } catch (IOException e) {        e.printstacktrace();      }    }    return filePath;  }  /**   * 根据URL得到输入流   *   * @param urlStr   * @return   */  public inputStream getinputStreamFromURL(String urlStr) {    httpURLConnection urlConn;    inputStream inputStream = null;    try {      url = new URL(urlStr);      urlConn = (httpURLConnection) url.openConnection();      inputStream = urlConn.getinputStream();    } catch (Exception e) {      e.printstacktrace();    }    return inputStream;  }

文件下载其实很简单,说白了,就是通过http获取inputStream ,然后通过解析inputStream 并写入到文件即可。
读取inputstream并写入到SDCard。

/**   * 将一个inputStream里面的数据写入到SD卡中   *   * @param path 文件保存路径   * @param filename 文件保存的名字   * @param input 文件输入流   * @return 文件   */  public file write2SDFrominput(String path,String filename,inputStream input) {    file file = null;    OutputStream output = null;    try {      // 创建文件夹      createSDDir(path);      // 创建文件      file = createSDfile(path + filename);      // 开启输出流,准备写入文件      output = new fileOutputStream(file);      // 缓冲区      byte[] buffer = new byte[fileSIZE];      int count;      while ((count = input.read(buffer)) != -1) {        // 这里,请一定按该方式写入文件,不然时而会出现文件写入错误,数据丢失问题        output.write(buffer,count);      }      output.flush();    } catch (Exception e) {      e.printstacktrace();    } finally {      try {        output.close();        input.close();      } catch (IOException e) {        e.printstacktrace();      }    }    return file;  }

inputstream写入到sdcard卡中,有个很重要的地方,先看下OutputStream 的write方法:

我推荐使用第二个方法write(byte[] b,int off,int len) ,目的是为了避免数据丢失。所以写文件代码如下:

 while ((count = input.read(buffer)) != -1) { // 这里,请一定按该方式写入文件,不然时而会出现文件写入错误,数据丢失问题 output.write(buffer,count);}

源码地址:https://github.com/zuiwuyuan/Http_Uploader_Downloader

以上便是我整理的AndroID http实现文件的上传和下载方法,希望对更多的人有所帮助。

总结

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

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

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

原文地址: http://outofmemory.cn/web/1141197.html

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

发表评论

登录后才能评论

评论列表(0条)

保存