如何将文件从网站保存到 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)) > 0) out.write(buffer, 0, count);
【参考方案2】:
Sourav 的答案是可以的,但是对于大文件大小,您应该在新线程上实现它;因为在下载时,主线程正忙于下载文件。如果等待时间超过预期,系统将产生“未响应”错误。
为此,您可以使用“TaskAsync”或“IntentService”
【讨论】:
【参考方案3】:我更喜欢构建soap服务器并从应用程序调用服务器并通过接收XML。或者,也许您可以创建一个生成 XML 并直接解析 URL 的 URL。
尝试阅读更多关于这个LINK
希望我已经回答了这个问题。否则很乐意提供帮助,但我需要更详细的功能描述。
【讨论】:
谢谢,我的问题是我想将驻留在本地主机服务器的 xml 文件保存到 sd 卡。只是为了保存。 嘿,要做到这一点,我建议只制作一个静态 php 下载脚本 (link),而不是简单地从一个 URL 下载,在你的手机上设置 SD 卡的路径...以上是关于如何将文件从网站保存到 SD 卡的主要内容,如果未能解决你的问题,请参考以下文章