Android实现简单的文件下载与上传

文件下载

/**
 * 下载服务 IntentService
 * 生命周期:
 * 1>当第一次启动IntentService时,Android容器
 *  将会创建IntentService对象。
 * 2>IntentService将会在工作线程中轮循消息队列,
 *  执行每个消息对象中的业务逻辑。
 * 3>如果消息队列中依然有消息,则继续执行,
 *  如果消息队列中的消息已经执行完毕,
 *  IntentService将会自动销毁,执行onDestroy方法。
 */
public class DownloadService extends IntentService{
  private static final int NOTIFICATION_ID = 100;
  public DownloadService(){
    super("download");
  }
  public DownloadService(String name) {
    super(name);
  }
  /**
   * 该方法中的代码将会在工作线程中执行
   * 每当调用startService启动IntentService后,
   * IntentService将会把OnHandlerIntent中的
   * 业务逻辑放入消息队列等待执行。
   * 当工作线程轮循到该消息对象时,将会
   * 执行该方法。
   */
  protected void onHandleIntent(Intent intent) {
    //发送Http请求 执行下载业务
    //1. 获取音乐的路径
    String url=intent.getStringExtra("url");
    String bit=intent.getStringExtra("bit");
    String title=intent.getStringExtra("title");
    //2. 构建File对象,用于保存音乐文件
    //   /mnt/sdcard/Music/_64/歌名.mp3
    File targetFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC),"_"+bit+"/"+title+".mp3" );
    if(targetFile.exists()){
      Log.i("info", "音乐已存在");
      return;
    }
    if(!targetFile.getParentFile().exists()){
      targetFile.getParentFile().mkdirs();
    }
    try {
      sendNotification("音乐开始下载", "音乐开始下载");
      //3. 发送Http请求,获取InputStream
      InputStream is = HttpUtils.getInputStream(url);
      //4. 边读取边保存到File对象中
      FileOutputStream fos = new FileOutputStream(targetFile);
      byte[] buffer = new byte[1024*100];
      int length=0;
      int current = 0;
      int total = Integer.parseInt(intent.getStringExtra("total"));
      while((length=is.read(buffer)) != -1){
        fos.write(buffer, 0, length);
        fos.flush();
        current += length;
        //通知下载的进度
        double progress = Math.floor(1000.0*current/total)/10;
        sendNotification("音乐开始下载", "下载进度:"+progress+"%");
      }
      //5. 文件下载完成
      fos.close();
      cancelNotification(); //重新出现滚动消息
      sendNotification("音乐下载完成", "音乐下载完毕");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  /**
   * 发通知
   */
  public void sendNotification(String ticker, String text){
    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    Notification.Builder builder = new Notification.Builder(this);
    builder.setSmallIcon(R.drawable.ic_launcher)
      .setContentTitle("音乐下载")
      .setContentText(text)
      .setTicker(ticker);
    Notification n = builder.build();
    manager.notify(NOTIFICATION_ID, n);
  }
  /**
   * 取消通知
   */
  public void cancelNotification(){
    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    manager.cancel(NOTIFICATION_ID);
  }
}

文件上传

 /**
   * 上传文件
   * @param uploadFile
   */
  private void uploadFile(final File uploadFile) {
    new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          uploadbar.setMax((int)uploadFile.length());
          String souceid = logService.getBindId(uploadFile);
          String head = "Content-Length="+ uploadFile.length() + ";filename="+ uploadFile.getName() + ";sourceid="+
            (souceid==null? "" : souceid)+"\r\n";
          Socket socket = new Socket("192.168.1.78",7878);
          OutputStream outStream = socket.getOutputStream();
          outStream.write(head.getBytes());
          PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream());
          String response = StreamTool.readLine(inStream);
          String[] items = response.split(";");
          String responseid = items[0].substring(items[0].indexOf("=")+1);
          String position = items[1].substring(items[1].indexOf("=")+1);
          if(souceid==null){//代表原来没有上传过此文件,往数据库添加一条绑定记录
            logService.save(responseid, uploadFile);
          }
          RandomAccessFile fileOutStream = new RandomAccessFile(uploadFile, "r");
          fileOutStream.seek(Integer.valueOf(position));
          byte[] buffer = new byte[1024];
          int len = -1;
          int length = Integer.valueOf(position);
          while(start&&(len = fileOutStream.read(buffer)) != -1){
            outStream.write(buffer, 0, len);
            length += len;
            Message msg = new Message();
            msg.getData().putInt("size", length);
            handler.sendMessage(msg);
          }
          fileOutStream.close();
          outStream.close();
          inStream.close();
          socket.close();
          if(length==uploadFile.length()) logService.delete(uploadFile);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }).start();
  }
} 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Android编程实现图片的上传和下载功能示例

    本文实例讲述了Android编程实现图片的上传和下载功能.分享给大家供大家参考,具体如下: 在实现一个Android的WEB服务客户端,比如微博,论坛客户端时,经常会使用到图片的上传和下载.在这里介绍如何利用HttpClient实现图片的上传和下载功能. 1 图片上传:上传图片时,首先获得图片的路径,创建文件,并将图片转化为字节流写入到request,并发送该请求. 客户端代码: File file = new File(imageUrl); String httpUrl = httpDomai

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

    最近做一个项目,其中涉及到文件的上传和下载功能,大家都知道,这个功能实现其实已经烂大街了,遂.直接从网上荡了一堆代码用,结果,发现网上的代码真是良莠不齐,不是写的不全面,就是有问题,于是自己重新整理了一番,把它们发出来,希望更多人能受用. 文件上传 通过org.apache.commons.httpclient.HttpClient来实现文件上传,该jar包可以直接从网上所搜.下载. /** * @param mContext 上下文 * @param targetUrl 文件上传地址 * @p

  • Android中FTP上传、下载的功能实现(含进度)

    Android中使用的FTP上传.下载,含有进度. 代码部分主要分为三个文件:MainActivity,FTP,ProgressInputStream 1. MainActivity package com.ftp; import java.io.File; import java.io.IOException; import java.util.LinkedList; import com.ftp.FTP.DeleteFileProgressListener; import com.ftp.F

  • Android FTP 多线程断点续传下载\上传的实例

    最近在给我的开源下载框架Aria增加FTP断点续传下载和上传功能,在此过程中,爬了FTP的不少坑,终于将功能实现了,在此把一些核心功能点记录下载. FTP下载原理 FTP单线程断点续传 FTP和传统的HTTP协议有所不同,由于FTP没有所谓的头文件,因此我们不能像HTTP那样通过设置header向服务器指定下载区间. 但是FTP协议提供了一个更好用的命令REST用于从指定位置恢复任务,同时FTP协议也提供了一个命令SIZE用于获取下载的文件大小,有了这两个命令,FTP断点续传也就没有什么问题.

  • Android实现文件上传和下载倒计时功能的圆形进度条

    screenshot 截图展示 import step1. Add it in your root build.gradle at the end of repositories: allprojects { repositories { ... maven { url 'https://jitpack.io' } } } step2. Add the dependency dependencies { compile 'com.github.yanjiabin:ExtendsRingPrigr

  • Android中使用七牛云存储进行图片上传下载的实例代码

    Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储原理,上面这幅图片是官方给出的原理图,表述当然比较清晰了. 可以看出,要进行图片上传的话可以分为五大步: 1. 客户端用户登录到APP的账号系统里面: 2. 客户端上传文件之前,需要向业务服务器申请七牛的上传凭证,这个凭证由业务服务器使用七牛提供的服务端SDK生成: 3. 客户端使用七牛提供的客户端

  • Android关于FTP文件上传和下载功能详解

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 此篇博客为整理文章,供大家学习. 1.首先下载commons-net  jar包,可以百度下载. FTP的文件上传和下载的工具类: package ryancheng.example.progressbar; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.Outpu

  • 使用Android的OkHttp包实现基于HTTP协议的文件上传下载

    OkHttp的HTTP连接基础 虽然在使用 OkHttp 发送 HTTP 请求时只需要提供 URL 即可,OkHttp 在实现中需要综合考虑 3 种不同的要素来确定与 HTTP 服务器之间实际建立的 HTTP 连接.这样做的目的是为了达到最佳的性能. 首先第一个考虑的要素是 URL 本身.URL 给出了要访问的资源的路径.比如 URL http://www.baidu.com 所对应的是百度首页的 HTTP 文档.在 URL 中比较重要的部分是访问时使用的模式,即 HTTP 还是 HTTPS.这

  • Android基于OkHttp实现下载和上传图片

    本文实例为大家分享了OkHttp实现下载图片和上传图片的具体代码,供大家参考,具体内容如下 MainActivity.java public class MainActivity extends AppCompatActivity { private String Path = "https://10.url.cn/eth/ajNVdqHZLLAxibwnrOxXSzIxA76ichutwMCcOpA45xjiapneMZsib7eY4wUxF6XDmL2FmZEVYsf86iaw/"

  • Android编程实现仿QQ发表说说,上传照片及弹出框效果【附demo源码下载】

    本文实例讲述了Android编程实现仿QQ发表说说,上传照片及弹出框效果.分享给大家供大家参考,具体如下: 代码很简单,主要就是几个动画而已,图标什么的就随便找了几个,效果图:   动画说明: 1.点击右上角按钮,菜单从顶部下拉弹出,同时背景变暗; 2.再次点击右上角按钮,点击返回键,或者点击空白区域(也就是变暗的部分),菜单向上收回; 3.点击菜单上的按钮响应事件,同时菜单收回(效果同2) 重要说明:动画结束后必须clearAnimation,否则隐藏状态的view依然能响应点击事件 主体代码

随机推荐