文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2022-06-06 07:56

关注

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

文件上传

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


  
  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(), file),
          new StringPart("filename", file.getName(), "UTF-8")};
filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));

文件下载

通过HttpURLConnection下载文件。


  
  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;
  }
  
  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。



  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, 0, 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, 0, count);
}

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

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

您可能感兴趣的文章:Android关于FTP文件上传和下载功能详解Android实现文件上传和下载倒计时功能的圆形进度条使用Android的OkHttp包实现基于HTTP协议的文件上传下载Android基于OkHttp实现下载和上传图片Android FTP 多线程断点续传下载\上传的实例Android编程实现仿QQ发表说说,上传照片及弹出框效果【附demo源码下载】Android中FTP上传、下载的功能实现(含进度)Android编程实现图片的上传和下载功能示例Android中使用七牛云存储进行图片上传下载的实例代码Android实现简单的文件下载与上传


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯