如何将文件从网站保存到 SD 卡

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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 卡的路径...

以上是关于如何将文件从网站保存到 SD 卡的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件保存到SD卡[重复]

如何将可绘制资源中的图像保存到 SD 卡?

flutter 将assets文件保存到sd卡

将图像、音频和视频保存到 SD 卡

Android - 将图像从 URL 保存到 SD 卡

自动将视频文件保存到 Android SD 卡