保存远程地址文件到本地
今天做活动时遇到一个下载报名表的需求。感觉实现过程很有趣,记录一下。
其中 Java 代码:
/** * @Description: 下载报名表 * @Author: 作者 * @CreateTime: 某年某月某日某时 * @param remoteFilePath 远程文件路径 * @param localPath 本地文件路径 */ public void downFile(String remoteFilePath, String localPath) { URL urlfile = null; HttpURLConnection httpUrl = null; BufferedInputStream bis = null; BufferedOutputStream bos = null; File f = new File(localPath); try { urlfile = new URL(remoteFilePath); httpUrl = (HttpURLConnection)urlfile.openConnection(); httpUrl.connect(); bis = new BufferedInputStream(httpUrl.getInputStream()); bos = new BufferedOutputStream(new FileOutputStream(f)); int len = 2048; byte[] b = new byte[len]; while ((len = bis.read(b)) != -1) { bos.write(b, 0, len); } bos.flush(); bis.close(); httpUrl.disconnect(); } catch (Exception e) { e.printStackTrace(); } finally { try { bis.close(); bos.close(); } catch (IOException e) { e.printStackTrace(); } } }
如果抛出异常:
java.io.FileNotFoundException: D:\xxx\yyy (拒绝访问。) at java.io.FileOutputStream.open(Native Method) at java.io.FileOutputStream.<init>(FileOutputStream.java:179) at java.io.FileOutputStream.<init>(FileOutputStream.java:131) at java.io.FileWriter.<init>(FileWriter.java:73)
原因在实例化 File file=new File(localPath); 的时候 localPath 是一个目录
解决办法,将 localPath 具体到文件名字。
后台接口是出来了,但是发现没解决实际问题。
毕竟下载到本地哪个文件夹不能写死。还得需要 JS 来辅助帮助用户选择目录。
下面是两种 JS 实现。
第一种:
<script> function SaveAs5(imgURL) { var oPop = window.open(imgURL,"","width=1, height=1, top=5000, left=5000"); for(; oPop.document.readyState != "complete"; ) { if (oPop.document.readyState == "complete")break; } oPop.document.execCommand("SaveAs"); oPop.close(); } </script> <img src="t_screenshot_17616.jpg" id="DemoImg" border="0" onclick="SaveAs5(this.src)">
第二种:
<script> function SaveAs5(imgURL) { var oPop = window.open(imgURL,"","width=1, height=1, top=5000, left=5000"); for(; oPop.document.readyState != "complete"; ) { if (oPop.document.readyState == "complete")break; } oPop.document.execCommand("SaveAs"); oPop.close(); } </script> <img src="../t_screenshot_17616.jpg" id="DemoImg" border="0"> <a href="#" onclick="SaveAs5(document.getElementById('DemoImg').src)"> 点击这里下载图片 </a>
这两种方式有个相同点 都是一样 low。并且也不是我想要的跟后台配合使用方式。
我需要的是弹出用户可以选择文件夹目录窗口的 JS 方法,获取地址配合后台使用。
。。。
后来发现只需一行代码就可以解决,并且调用的是浏览器自身的下载方式。很完美。
谷歌是直接在当前页面下载到固定目录。
火狐是弹出一个可以选择目录的窗口,再点击保存。代码如下:
<a href="url"></a>
一个大写的囧,是我把问题复杂化了。
接下来再附一个禁止跳转事件的 a 标签
<a href="javascript:;" target="_blank">