1.对于给定的http://ip/flows/data/xxx.txt,想要下载,本来思路直接windows.open(url)搞定
但是这样有一个问题,浏览器直接把txt打开,而无法提供下载。
一通google后,发现JS的一些代码也解决不了。
最后想到还是用流的方式进行返回,设置返回类型为附件形式即可:
getResponse().setHeader("Content-disposition","attachment; filename="+new String(fileName.getBytes("GB2312"),"ISO-8859-1"));
2.我的解决方案:
步骤一:因为我的项目用的struts2架构,因此选择的方法先是用java远程把txt下载到服务器上:
public InputStream getInputStream() throws Exception {
String fileName = "flows_" + getSession().get(TASK_ID) + ".txt";
String fileUrl = "http://159.226.8.104/flows/data/" + fileName;
String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String downPath = "D:/" + date + "/"; //本地版
// String downPath = "/home/tempFlowTxt/"; //服务器版
downUrlTxt(fileName, fileUrl, downPath);
return new FileInputStream(downPath+fileName);
}
public void downUrlTxt(String fileName,String fileUrl,String downPath){
File savePath = new File(downPath);
if (!savePath.exists()) {
savePath.mkdir();
}
String[] urlname = fileUrl.split("/");
int len = urlname.length-1;
String uname = urlname[len];//获取文件名
try {
File file = new File(savePath+"/"+uname);//创建新文件
if(file!=null && !file.exists()){
file.createNewFile();
}
OutputStream oputstream = new FileOutputStream(file);
URL url = new URL(fileUrl);
HttpURLConnection uc = (HttpURLConnection) url.openConnection();
uc.setDoInput(true);//设置是否要从 URL 连接读取数据,默认为true
uc.connect();
InputStream iputstream = uc.getInputStream();
System.out.println("file size is:"+uc.getContentLength());//打印文件长度
byte[] buffer = new byte[4*1024];
int byteRead = -1;
while((byteRead=(iputstream.read(buffer)))!= -1){
oputstream.write(buffer, 0, byteRead);
}
oputstream.flush();
iputstream.close();
oputstream.close();
} catch (Exception e) {
System.out.println("读取失败!");
e.printStackTrace();
}
System.out.println("生成文件路径:"+downPath+fileName);
}
步骤二:把下载到本地的txt,用struts2方式进行下载(各种下载本地文件的方式都可以,例如fileupload或者读入流,然后以输出流方式返回浏览器)
以上解决了下载txt问题!