当前位置: 移动技术网 > 移动技术>移动开发>Android > Android实现简单的文件下载与上传

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

2019年07月30日  | 移动技术网移动技术  | 我要评论

文件下载

/**
 * 下载服务 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(); 
  } 
} 

总结

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网