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

11

有人知道如何通过 wifi 将文件从 web 服务器(本地主机)保存到 sd 卡吗?

我正在对我的应用程序进行 xml 解析,为此我必须从本地主机下载一个 xml 文件到 sd 卡,然后标记解析。我陷入了将 xml 文件下载到 sd 卡的困境中。请指导我如何做到这一点。

3个回答

42

您可以使用此方法将文件从互联网下载到您的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>

抱歉,我对此一无所知。也许这篇帖子可以帮到你 - Sourav
@HariRam:你可能想把这个方法放在一个AsyncTask或者一个新的Thread中调用。这样,下载过程就对用户隐藏了。 - Jayson Tamayo
4
我不喜欢逐个字节地读取文件,最好改成缓冲的方式。另外,你为什么要将整个流读入到ByteArrayBuffer中,而不是直接写入文件(另一个流)呢?更好的解决方案是使用以下代码:int count; byte[] buffer = new byte[8192]; while ((count = in.read(buffer)) > 0) out.write(buffer, 0, count); - Selvin
@Sourav 我已经成功下载了文件,但它并没有被识别为视频文件。当我尝试打开这个文件时,它显示“无法找到执行此操作的应用程序”。请问如何将其转换为视频文件而不仅仅是一个文件? - Kartheek Sarabu
@delive,你当时想要创建什么? - Sourav
显示剩余8条评论

1
Sourav的回答还可以,但对于大文件大小,您应该在新线程上实现它;因为在下载时,主线程会忙于下载文件。如果等待时间超过预期,系统将生成“无响应”错误。
为了做到这一点,您可以使用“TaskAsync”或“IntentService”。

0
我更喜欢构建SOAP服务器,并从应用程序向服务器发起调用,从而接收XML。或者,您可以创建一个生成XML的URL,直接解析该URL。 请在LINK上阅读更多相关信息。 希望我已经回答了您的问题。如果没有,我很乐意提供帮助,但需要更详细的功能描述。

谢谢,我的问题是我想将存储在本地主机服务器上的XML文件保存到SD卡中。只是为了保存。 - RAAAAM
嘿,要做到这一点,我建议只需制作一个静态的PHP下载脚本(链接),然后从一个URL下载到你的手机上,在那里设置一个SD卡路径... - M.V.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接