2014-12-20 146 views
0

我正在访问网站下载一些文件,但一旦文件下载后扩展名(.zip等)丢失。 项目API 21(Android 5.0.1)。下载的文件缺少扩展名

private void execute(final Context context) { 
    Intent service = null; 
    while ((service = queue.peek()) != null) { 
     if (running == null) { 
      service = queue.remove(); 

      final Bundle extras = service.getExtras(); 
      final String url = extras.getString(DownloaderService.KEY_URL); 
      final String title = extras.getString(DownloaderService.KEY_TITLE); 
      final String filename = url.substring(url.lastIndexOf('/') + 1); 

      final File parentDir = new File(Constants.WEB_DIR, title); 
      if (!parentDir.exists()) 
       parentDir.mkdirs(); 
      final File file = new File(parentDir, (title == null ? filename : title)); 
      //Log.d("OUTPUTFILE: ", parentDir + "/" + filename); 
      final ProgressNotification notification = new ProgressNotification(context, file); 
      notification.createWaiting(title == null ? filename : title); 

      context.startService(service); 
      running = service; 
      Log.d(Constants.LOG, "download started"); 
      Log.d(Constants.LOG, "running downloads: " + running); 
      break; 
     } 
    } 
} 

有人可以帮我吗?

目录和文件在那里,我可以使用Android安装程序执行文件,但只是文件扩展名丢失。

+0

如果有标题,则使用标题作为文件名。我想,标题没有扩展名。 – Henry

+0

嗨亨利好提示,但如果我改为“最终文件文件=新文件(parentDir +”/“+文件名);” “notification.createWaiting(filename);”它仍然没有工作。 – Bjorn

+0

在'final String url = ...'处设置断点时,url是否包含执行该行时的文件名和扩展名? – Melquiades

回答

0

你看过你正在检索文件的服务器发送的MIME类型吗?

如果原始存储机制没有包含带存储的mimetype,它可能被强制为application/octet流 - 认为它是二进制数据。例如,当你上传一个没有设置mimetype属性的文件时,这就是s3发生的情况 - 或者你在上传过程中以某种方式隐藏它。

当你然后访问内容URI时,你会得到一个可能被下载系统解释为不明确的文件。当MIME类型不明确时,这可能会导致各种问题,如mime type map返回空字符串作为扩展名。

Good information about mime types and their configurations.

You could also add the step to guess the mime type from the stream - 作为保障。

0

由我自己解决了这个问题,这个bug是别的地方,这里是正确的代码:

@Override 
public void onStart(final Intent intent, final int startId) { 
    final Bundle extras = intent.getExtras(); 
    final String username = extras.getString(KEY_USERNAME); 
    final String password = extras.getString(KEY_PASSWORD); 
    final String url = extras.getString(DownloaderService.KEY_URL); 
    final String title = extras.getString(KEY_TITLE); 
    final String filename = url.substring(url.lastIndexOf('/') + 1); 

    final File parentDir = new File(Constants.WEB_DIR title); 
    if (!parentDir.exists()) 
     parentDir.mkdirs(); 
    final File file = new File(parentDir + "/" + filename); <---- solved 
    notification = new ProgressNotification(DownloaderService.this, file); 
    super.onStart(intent, startId); 

    new Thread() { 

     @Override 
     public void run() { 
      try { 
       download(); 
      } catch (final Exception e) { 
       Log.e(Constants.LOG, e.getMessage(), e); 
       parentDir.delete(); 
      } 
      stopSelf(); 
     } 

但THX家伙把我在正确的轨道上。