当前位置:首页 > CN2资讯 > 正文内容

解决下载ftp文件过程中,浏览器直接解析文件(txt,png等)的问题从ftp服务器下载文件失败

3天前CN2资讯


​​推荐一款ftp客户端工具:iis7服务器管理工具​​

IIs7服务器管理工具可以批量管理ftp站点,同时具备定时上传下载的功能。

作为服务器集成管理器,它最优秀的功能就是批量管理windows与linux系统服务器、vps。

能极大的提高站长及服务器运维人员工作效率。同时iis7服务器管理工具还是vnc客户端,服务器真正实现了一站式管理,可谓是非常方便。

 

 

 

搭建了一个ftp服务器,供用户进行上传下载,在下载过程中发现,一些文件,例如txt,jpg,png,pdf等直接被浏览器解析了。在浏览器中显示其内容,没有下载。

下面通过网上查询得到一些解决方法:

 最简单的方法:

在txt文档上面,点击右键》链接另存为    就可以直接下载。

1:修改ftp目录下的.htacess文件,这个文件主要做一些类型映射,使各个文件类型映射为  octet-stream 类型,这样浏览器就不能解析了。

     但是,我没有在ftp目录下发现该文件,通过filezilla连接服务器, filezilla>服务器>强制显示隐藏文件 ,也没有发现该文件。听说该文件是apache独有的,我用的是vsftpd服务器,不知道是否存在不一致,于是放弃。

2:第二种方法

      使用ajax请求,将文件输出流(OutputStream)作为回调结果返回。

html代码,   后台代码同第4中方法。



<!DOCTYPE html>
<html lang="en">
<head>
<script type="text/javascript" src="/js/jquery-3.0.0.min.js"></script>
<meta charset="UTF-8">
<title>Title</title>

<script>
function link() {
$.ajax({
type: "get", //请求方式
url: "downloadFileByOutputStream", //请求路径
data: {
"filename":'homepage.png' //请求参数
},
async: true, //异步,(同步已经废弃,会报错)。
success: function (flag) { //请求成功,flag返回数据
if (flag != "") {
console.log(flag); //浏览器控制台打印数据
var obj = eval(flag); //对数据进行转换
localStorage['UsertypeSelect']=JSON.stringify(obj); //将返回的数据存储到本地。
};
}
});
}
</script>
</head>
<body>
<a href="javascript:void(0)" onclick="link()">客户端下载OutputStream</a> //调用上面的函数
</body>
</html>


调用之后,发现数据乱码,  eval(flag)对返回数据转化失败。

 

3:  使结果作为PrintWriter流作为回调结果,使用隐藏表单提交的方式对流进行回调。结果  txt,doc等字符文件能够下载,但是图片等字节文件不能下载。

        前端代码:



<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="/js/jquery-3.0.0.min.js"></script>
<script>
function download(){
console.log('执行');
downloadTemplate('/downloadFileByPrintWriter', 'filename', 'homepage.png');
}
function downloadTemplate(action, type, value){ //action 请求接口, type : 后台接口需要的参数名,value 请求的参数值
console.log(action);
var form = document.createElement('form'); //创建表单
document.body.appendChild(form);
form.style.display = "none";
form.action = action; //接口
form.id = 'download'; //表单id
form.method = 'post'; //请求方式

var newElement = document.createElement("input"); //创建元素,类型为input
newElement.setAttribute("type","hidden"); //隐藏
= type; //元素名为type
newElement.value = value; //元素值 value
form.appendChild(newElement);
form.submit(); //提交
}
</script>
</head>
<body>

<span onclick="download()">客户端下载PrintWriter</span>

</body>
</html>


后台代码:

 



/**
* 根据给定的文件名进行下载
* Description: 从FTP服务器下载文件
* @param filename 要下载的文件名
* @return
*/
@RequestMapping("/downloadFileByPrintWriter")
@ResponseBody
public String downloadFileByPrintWriter(HttpServletResponse response, String filename) throws IOException {
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(host, port);
ftp.login(username, password);// 登录
ftp.enterLocalPassiveMode(); //将ftp设置为被动模式。否则不成功。

reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return "ftp无连接";
}
ftp.changeWorkingDirectory(publicFilePath);// 转移到FTP服务器目录
logger.debug("远程路径" + publicFilePath);
FTPFile[] fs = ftp.listFiles();
for (FTPFile ff : fs) {
logger.debug("远程文件名" + ff.getName());
if (ff.getName().equals(filename)) {
InputStream in = ftp.retrieveFileStream(ff.getName()); //读取ftp服务器文件,返回输入流
int len = 0;
byte[] buff = new byte[1024];
response.reset(); //重置响应
response.setContentType("application/octet-stream"); //设置响应类型为流类型
response.addHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); //文件名
InputStreamReader inputStreamReader = new InputStreamReader(in);

PrintWriter fw = response.getWriter(); //得到response的字符打印流

//创建一个rd的字符留缓冲区,将字符装载入缓冲区中
BufferedReader bf = new BufferedReader(inputStreamReader);
char[] chs = new char[1024];
// while ((len = bf.read(chs)) != 0) {
// logger.debug("向fw写入");
//// fw.write(chs, 0, len);
// }
String str=null;
while ((str = bf.readLine()) != null) {
fw.write(str); //将ftp输入流写出到printWriter
fw.flush();
}
fw.flush();
in.close();
fw.close();
return "成功";
}
}
ftp.logout();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return "下载失败";
}


4:将文件作为OutputStream流作为回调结果,使用隐藏表单提交的方式对流进行回调。成功

 html代码



<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="/js/jquery-3.0.0.min.js"></script>
<script>
function download(){
console.log('执行');
downloadTemplate('/downloadFileByOutputStream', 'filename', 'homepage.png');
}
function downloadTemplate(action, type, value){
console.log(action);
var form = document.createElement('form');
document.body.appendChild(form);
form.style.display = "none";
form.action = action;
form.id = 'download';
form.method = 'post';

var newElement = document.createElement("input");
newElement.setAttribute("type","hidden");
= type;
newElement.value = value;
form.appendChild(newElement);
form.submit();
}
</script>
</head>
<body>

<span onclick="download()">客户端下载PrintWriter</span>

</body>
</html>


后台代码:



/**
* 根据给定的文件名进行下载
* Description: 从FTP服务器下载文件
* @param filename 要下载的文件名
* @return
*/
@RequestMapping("/downloadFileByOutputStream")
@ResponseBody
public String downloadFileByOutputStream(HttpServletResponse response, String filename) throws IOException {
logger.debug("下载ByOutputStream");
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(host, port);
// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftp.login(username, password);// 登录
ftp.enterLocalPassiveMode(); //将ftp设置为被动模式。否则不成功。
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return "连接失败";
}
ftp.changeWorkingDirectory(publicFilePath);// 转移到FTP服务器目录
logger.debug("远程路径" + publicFilePath);
FTPFile[] fs = ftp.listFiles();
for (FTPFile ff : fs) {
logger.debug("远程文件名" + ff.getName());
if (ff.getName().equals(filename)) {
InputStream in = ftp.retrieveFileStream(ff.getName());
logger.debug(in.toString());
int len = 0;
byte[] buff = new byte[1024*1024];

response.reset();
response.setContentType("application/octet-stream");
//Name the file
response.addHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
// response.addHeader("Content-Length", out..ToString());
OutputStream out=response.getOutputStream(); //响应输出字节流

// OutputStream out = new PipedOutputStream();
while((len=in.read(buff))!=-1){
logger.debug("以字节流形式写出OutPutStream");
out.write(buff, 0, len);
out.flush();
}
in.close();
out.close();
return "成功";
}
}

ftp.logout();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return "失败";
}


 


本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/19711.html

    分享给朋友:

    “解决下载ftp文件过程中,浏览器直接解析文件(txt,png等)的问题从ftp服务器下载文件失败” 的相关文章

    宝塔安装扩展不生效的解决方案与技巧

    在服务器管理的世界中,宝塔面板无疑是一款强大而受欢迎的工具。它让用户以更简单的方式进行服务器管理。通过宝塔,用户可以轻松管理网站、数据库和各种扩展。而PHPExcel等PHP扩展的安装显得尤为重要,因为它们提供了许多强大的功能,助力网站正常运行。 PHP扩展的重要性不言而喻。没有合适的扩展,网站可能...

    六六云使用教程及价格比较,让你轻松选择合适的云服务

    六六云使用教程 六六云,作为一个备受欢迎的云服务平台,提供原生IP和住宅IP VPS服务器,适合多种需求,比如电商、游戏和流媒体等。选择合适的VPS套餐,是使用六六云的第一步。我们可以从多个方面进行比较,了解各个地区的服务器优缺点。比如,美国的服务器在速度上表现出色,但价格可能较高,而香港服务器则在...

    微信海外服务器助力全球化业务拓展与用户体验优化

    微信海外服务器是微信在全球范围内部署的技术基础设施,旨在支持其海外业务的发展。这些服务器不仅是数据存储的中心,还承担着用户信息处理和互动的各种功能。随着技术的不断进步,微信的使用需求也在全球范围内快速增长,这种现象驱动着微信不断扩展其海外服务器的网络。 我们时常看到,微信与WeChat的分拆让用户数...

    选择合适的服务器购买攻略:性能、预算与品牌分析

    在购买服务器之前,进行充分的准备至关重要。首先,我喜欢明确自己购买服务器的目的。是否只是用来搭建网站,还是用于复杂的数据处理,抑或是作为云计算的基础设施?这些需求会直接影响我的选择。明确目标后,我可以更好地针对我的具体需求进行规划。 接着,我必须考虑预算。无论是想购买入门级的服务器,还是高性能的旗舰...

    轻云互联:助力企业数字化转型的云计算解决方案

    轻云互联是隶属于广州轻云网络科技有限公司的云计算服务提供商。自成立以来,轻云互联专注于云计算领域,提供一系列全方位的一体化解决方案。这些解决方案涵盖了云计算产品、租用托管服务、云服务器、裸金属服务器、云虚拟主机以及游戏云服务等。走进轻云互联,你会发现这里不仅是一个技术创新的平台,更是一个通过边缘计算...

    购买DNS解锁服务器的最佳选择与配置指南

    在当今的信息时代,获取我们想要的内容常常并不像想象中那样简单。很多流媒体服务在不同地区的可用性有所限制,这使得我们在享受内容时常常受到阻碍。这时候,DNS解锁服务器就成为了解决这个问题的有效工具。DNS解锁技术通过修改服务器上的DNS设置,可以帮助用户突破地理限制,顺利访问各种国际流媒体服务。 我刚...