广告
返回顶部
首页 > 资讯 > 移动开发 >Android Http实现文件的上传和下载
  • 477
分享到

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

HTTPAndroid 2022-06-06 07:06:28 477人浏览 独家记忆
摘要

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

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

文件上传

通过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实现简单的文件下载与上传


--结束END--

本文标题: Android Http实现文件的上传和下载

本文链接: https://www.lsjlt.com/news/24430.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android Http实现文件的上传和下载
    最近做一个项目,其中涉及到文件的上传和下载功能,大家都知道,这个功能实现其实已经烂大街了,遂、直接从网上荡了一堆代码用,结果,发现网上的代码真是良莠不齐,不是写的不全面,就是有...
    99+
    2022-06-06
    HTTP Android
  • Go 语言实现 HTTP 文件上传和下载
    前言: 近我使用 Go 语言完成了一个正式的 Web 应用,有一些方面的问题在使用 Go 开发 Web 应用过程中比较重要。过去,我将 Web 开发作为一项职业并且把使用不同的语言和...
    99+
    2022-11-11
  • ASP.NETCore实现文件上传和下载
    本文实例为大家分享了ASP.NET Core实现文件上传和下载的具体代码,供大家参考,具体内容如下 一、文件上传 1.1 获取文件后缀 /// <summary> ///...
    99+
    2022-11-13
  • Go实现文件上传和下载
    本文实例为大家分享了Go实现文件上传和下载的具体代码,供大家参考,具体内容如下 一.文件上传 文件上传:客户端把上传文件转换为二进制流后发送给服务器,服务器对二进制流进行解析 HTM...
    99+
    2022-11-11
  • vue实现文件上传和下载
    本文实例为大家分享了vue实现文件上传和下载的具体代码,供大家参考,具体内容如下 文件上传 vue中的文件上传主要分为两步:前台获取到文件和提交到后台 获取文件 前台获取文件,主要是...
    99+
    2022-11-12
  • springMVC实现文件上传和下载
    本文实例为大家分享了springMVC实现文件上传和下载的具体代码,供大家参考,具体内容如下 1准备工作 web.xml文件导入DispatcherServlet,Character...
    99+
    2022-11-12
  • java实现文件上传和下载
    本文实例为大家分享了java实现文件上传和下载的具体代码,供大家参考,具体内容如下 文件的上传 upload:文件上传 客户端通过表单的文件域file  把客户端的文件 上...
    99+
    2022-11-12
  • 使用Android的OkHttp包实现基于HTTP协议的文件上传下载
    OkHttp的HTTP连接基础 虽然在使用 OkHttp 发送 HTTP 请求时只需要提供 URL 即可,OkHttp 在实现中需要综合考虑 3 种不同的要素来确定与 HTTP...
    99+
    2022-06-06
    okhttp 文件上传 http协议 Android
  • Android OKhttp使用(下载和上传文件)
    Android okhttp的使用 首先在build.gradle中引入okhttp implementation 'com.squareup.okhttp3:okhttp:3.14.2' implementation 'co...
    99+
    2023-08-23
    okhttp android
  • Spring MVC 实现文件的上传和下载
    文章目录 前言1. 文件上传1.1 文件上传介绍1.2 文件上传实现1.2.1 添加依赖1.2.2 配置上传解析器1.2.3 通过表单上传1.2.4 创建控制器类1.2.5 上传演示 ...
    99+
    2023-09-26
    spring mvc java java-ee
  • Spring MVC实现文件上传和下载
    本文实例为大家分享了Spring MVC实现文件上传和下载的具体代码,供大家参考,具体内容如下 文件上传 1、导入主要依赖 <!--文件上传--> <depe...
    99+
    2022-11-12
  • Spring Boot实现文件上传和下载
    实现Spring Boot文件上传和下载的步骤: 1.文件上传 在pom.xml文件中添加依赖:spring-boot-starter-web和spring-boot-starter-thymelea...
    99+
    2023-09-06
    spring boot java servlet
  • SpringMVC实现上传下载文件
    本文实例为大家分享了SpringMVC实现上传下载文件的具体代码,供大家参考,具体内容如下 一、SpringMVC专门提供了CommonsMultipartResolver组件用于文...
    99+
    2022-11-13
  • php如何实现文件的上传和下载
    这篇文章将为大家详细讲解有关php如何实现文件的上传和下载,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、Java、Pe...
    99+
    2023-06-14
  • springMVC怎么实现文件上传和下载
    本篇内容介绍了“springMVC怎么实现文件上传和下载”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本文实例为大家分享了springMVC...
    99+
    2023-06-20
  • Vue实现文件上传和下载功能
    本文实例为大家分享了Vue实现文件上传和下载功能的具体代码,供大家参考,具体内容如下 1、a标签download属性 在H5中,为a标签新增了一个download属性,来直接文件的...
    99+
    2022-11-12
  • SpringBoot如何实现上传和下载文件
    这篇文章主要介绍SpringBoot如何实现上传和下载文件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!技术概述我们的项目是实现一个论坛。在论坛上发布博客时应该要可以上传文件,用户阅读博客是应该要可以下载文件。于是我...
    99+
    2023-06-20
  • Servlet实现文件的上传与下载
    前言: 文件的上传和下载在日常开发中很是常见,那么这一功能是如何实现的呢,下面我给大家介绍一下 实现条件: 1、需要一个form标签,method为post请求 2、form的enc...
    99+
    2022-11-11
  • JavaWeb实现文件的上传与下载
    JavaWeb实现文件的上传与下载,供大家参考,具体内容如下 第一步:导包 导入commons-fileupload-1.3.3.jar和commons-io-2.4.jar两个依赖...
    99+
    2022-11-12
  • SpringMVC实现文件上传与下载
    本文实例为大家分享了SpringMVC实现文件上传与下载的具体代码,供大家参考,具体内容如下 0.环境准备 1.maven依赖 <dependencies> ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作