【问题标题】:How to save file from website to sdcard如何将文件从网站保存到 SD 卡
【发布时间】:2011-07-25 05:46:00
【问题描述】:

有谁知道如何通过wifi将文件从网络服务器(本地主机)保存到sdcard?

我正在对我的应用程序进行 xml 解析,为此我必须将 xml 文件从 localhost 下载到 sdcard,然后标记解析。我坚持将 xml 文件下载到 sd 卡。请指导我如何做到这一点..

【问题讨论】:

    标签: android download sd-card


    【解决方案1】:

    您可以使用此方法将文件从互联网下载到您的 SD 卡:

    public void DownloadFromUrl(String DownloadUrl, String fileName) {
    
       try {
               File root = android.os.Environment.getExternalStorageDirectory();               
    
               File dir = new File (root.getAbsolutePath() + "/xmls");
               if(dir.exists()==false) {
                    dir.mkdirs();
               }
    
               URL url = new URL(DownloadUrl); //you can write here any link
               File file = new File(dir, fileName);
    
               long startTime = System.currentTimeMillis();
               Log.d("DownloadManager", "download begining");
               Log.d("DownloadManager", "download url:" + url);
               Log.d("DownloadManager", "downloaded file name:" + fileName);
    
               /* Open a connection to that URL. */
               URLConnection ucon = url.openConnection();
    
               /*
                * Define InputStreams to read from the URLConnection.
                */
               InputStream is = ucon.getInputStream();
               BufferedInputStream bis = new BufferedInputStream(is);
    
               /*
                * Read bytes to the Buffer until there is nothing more to read(-1).
                */
               ByteArrayBuffer baf = new ByteArrayBuffer(5000);
               int current = 0;
               while ((current = bis.read()) != -1) {
                  baf.append((byte) current);
               }
    
    
               /* Convert the Bytes read to a String. */
               FileOutputStream fos = new FileOutputStream(file);
               fos.write(baf.toByteArray());
               fos.flush();
               fos.close();
               Log.d("DownloadManager", "download ready in" + ((System.currentTimeMillis() - startTime) / 1000) + " sec");
    
       } catch (IOException e) {
           Log.d("DownloadManager", "Error: " + e);
       }
    
    }
    

    您需要在您的 AndroidManifest.xml 中添加以下权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    

    【讨论】:

    • 这真是一个很好的答案......还有一个问题,你知道如何以隐形模式存储文件吗? (ie) 存储文件永远不会对用户可见。
    • 抱歉,我对此一无所知。也许this post will help
    • @HariRam :您可能希望在AsyncTask or in a new Thread 中放置或调用此方法。这样,下载过程对用户来说是隐藏的。
    • @Selvin 这段时间有什么问题?
    • 我不喜欢逐字节读取,只需将其更改为某个缓冲版本,接下来为什么要将整个流读取到 ByteArrayBuffer,而只是将其写入文件(另一个流)...所以更好的解决方案是int count; byte[] buffer = new byte[8192]; while ((count = in.read(buffer)) &gt; 0) out.write(buffer, 0, count);
    【解决方案2】:

    Sourav 的答案是可以的,但是对于大文件大小,您应该在新线程上实现它;因为在下载时,主线程正忙于下载文件。如果等待时间超过预期,系统将产生“未响应”错误。

    为此,您可以使用“TaskAsync”或“IntentService

    【讨论】:

      【解决方案3】:

      我更喜欢构建soap服务器并从应用程序调用服务器并通过接收XML。或者,也许您可​​以创建一个生成 XML 并直接解析 URL 的 URL。

      尝试阅读更多关于这个LINK

      希望我已经回答了这个问题。否则很乐意提供帮助,但我需要更详细的功能描述。

      【讨论】:

      • 谢谢,我的问题是我想将驻留在本地主机服务器的 xml 文件保存到 sd 卡。只是为了保存。
      • 嘿,要做到这一点,我建议只制作一个静态 PHP 下载脚本 (link),而不是简单地从一个 URL 下载,在你的手机上设置 SD 卡的路径...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多