如何在点击a标签下载文件的时候通过JavaScript动态的修改文件的名称?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在点击a标签下载文件的时候通过JavaScript动态的修改文件的名称?相关的知识,希望对你有一定的参考价值。

比如说,我在页面上有这样两个个a标签:

前面一个是用来打开一个在线编辑页面,并将文件路径参数传递到该页面的a标签。
后面则是真正的下载a标签。但是现在的情况是,由于上传文件名存在重复,所以程序就自动生成了文件名。

现在想做的是,能不能在点击[下载]的时候,能将下载文件名改成原来的文件名。 尽量只使用前台的javascript,因为后台逻辑是别人写的,我不想该。

<script type="text/javascript">

$("a").click(function ()

var href = this;

var url = href.href;

var name = href.innerhtml;

if (url.indexOf("kindeditor") >= 0)

download(url, name);

return false;

)

/**

* 下载

* @param  String url 目标文件地址

* @param  String filename 想要保存的文件名称

*/

function download(url, filename)

getBlob(url, function (blob)

saveAs(blob, filename);

);

;

/**

* 获取 blob

* @param  String url 目标文件地址

* @return cb 

*/

function getBlob(url, cb)

var xhr = new XMLHttpRequest();

xhr.open('GET', url, true);

xhr.responseType = 'blob';

xhr.onload = function ()

if (xhr.status === 200)

cb(xhr.response);

;

xhr.send();

/**

* 保存

* @param  Blob blob     

* @param  String filename 想要保存的文件名称

*/

function saveAs(blob, filename)

if (window.navigator.msSaveOrOpenBlob)

navigator.msSaveBlob(blob, filename);

else

var link = document.createElement('a');

var body = document.querySelector('body');

link.href = window.URL.createObjectURL(blob);

link.download = filename;

// fix Firefox

link.style.display = 'none';

body.appendChild(link);

link.click();

body.removeChild(link);

window.URL.revokeObjectURL(link.href);

;

</script>


参考技术A 前台办不到的! 让后台改去 参考技术B   我想问下你是不是想把 635000676971250000.ppt 显示成 OA培训130327.ppt???
  如果你不想修改后台代码,我说下你看看这个方法可以不。你在a标签中再加个参数。
  例如:../DaoFramer/ReadFile.aspx?FilePath=635000676971250000.ppt&name=OA培训130327.ppt,然后你在ReadFile.aspx这个页面的Js中修改。

  var path=window.location.search;//返回?以后的内容,path值为?FilePath=635000676971250000.ppt&name=OA培训130327.ppt、
  var name=path.split("&")[1].split("=")[1];//获取OA培训130327.ppt的值
  然后在页面加载的最后 把值替换追问

你说加载替换是替换哪个部分?
把第二个下载a标签的路径替换吗?
实际上传后的文件名就是一个数字了,原来的名字只是记录在数据库里的一个字符串。
我现在希望这样解决。
在[下载]标签上加一个click事件,在点击下载的时候,将下载到用户桌面上的那个文件名改成原来的名字。原来的名字在html上也好找。就是这个下载标签的前一个a标签的innerText属性。

追答

你的a 标签是连接到ReadFile.aspx 这是另外一个页面,所以你要改的话必须到ReadFile.aspx这个页面去修改。

我说的替换时指

你可以把红框里面的内容用一个标签包起来,然后在页面加载的最后,显示你想显示的名称。

追问

不是,我明白你的意思了。但是我这有两个a标签,点击第一个a是进入编辑页面;点第二个才是下载。编辑页面和下载之间没有什么关系。它们两者互不影响的。
我截的那张图是点击下载按钮后浏览器显示的下载提示。是点击当前页面的[下载]链接弹出的。
和第一个进入编辑页面的a标签没联系的。
那么进入到了编辑页面改变什么呢?现在都已经不在下载那个页面了。

本回答被提问者和网友采纳

二期项目总结 通过a标签打开文件上传选择框,使用Ajax上传文件

 

很多时候我们会给a标签增加一个点击事件,用于上传文件。为什么不使用原滋原味的文本打开按钮呢?当然是不好看,而且样式难以控制。

这时候可以通过控制a标签,给它添加一个点击事件,在a标签触发点击事件的时候打开文本选择框,就很好看了。

好了,现在来上思路:

先要给出一个a标签和文本选择的打开input,但是这个input的display要设置为none, 如下:

<a id="uoloadA" onclick="ClickInput()">上传文件</a>
    <input type="file" style="display:none" id="InputUpload" onchange="changeInput()"/>

a标签有一个点击方法,点击时触发这个方法,这个方法里面用于打开文本选择器,如下:

    function ClickInput(){
        //动态给文件打开框触发点击事件
        document.getElementById("InputUpload").click();
    }

 

这样,一点击a标签就会打开文本选择框,

input里面有一个onchange的方法,用于监控文本选择器的状态,如果文本选择器选择了一个文件,就会触发这个方法。那么这个方法里面写的就是ajaxFileUpload的请求代码了

如下:

//当文件选择框改变时,就上传文件,里面发Ajax请求到处理层
    function changeInput(){
        $.ajaxFileUpload({
            fileElementId:‘InputUpload‘,  //要上传的文件的id
            url:‘Upload.jsp‘,  //请求的地址,
            type:‘post‘,        //请求的方式
            dataType:‘text‘,    //返回数据时的格式,也可以将Text改为json,这个要看具体需求 
             secureuri: false,  //是否需要安全协议,一般设置为false
             
             async : true,      //是否是异步
             
             success: function(data) {   //提交成功后自动执行的处理函数,参数data就是服务器返回的数据。
                 if($.trim(data) != null){
                    alert("上传成功!");
                 }
             },
             error: function(data, status, e) {  //提交失败自动执行的处理函数。
                alert("上传失败!");
             }
        });
    }

这样就可以上传一个文件到处理层,在处理层里面通过smartUpload来处理,就可以成功的上传一个文件了。

 

 

 

1、url            上传处理程序地址。  
2,fileElementId       需要上传的文件域的ID,即<input type="file">的ID。
3,secureuri        是否启用安全提交,默认为false。 
4,dataType        服务器返回的数据类型。可以为xml,script,json,html。如果不填写,jQuery会自动判断。
5,success        提交成功后自动执行的处理函数,参数data就是服务器返回的数据。
6,error          提交失败自动执行的处理函数。
7,data           自定义参数。这个东西比较有用,当有数据是与上传的图片相关的时候,这个东西就要用到了。
8, type            当要提交自定义参数时,这个参数要设置成post

错误提示:

1,SyntaxError: missing ; before statement错误
  如果出现这个错误就需要检查url路径是否可以访问
2,SyntaxError: syntax error错误
  如果出现这个错误就需要检查处理提交操作的服务器后台处理程序是否存在语法错误
3,SyntaxError: invalid property id错误
  如果出现这个错误就需要检查文本域属性ID是否存在
4,SyntaxError: missing } in XML expression错误
  如果出现这个错误就需要检查文件name是否一致或不存在
5,其它自定义错误
  大家可使用变量$error直接打印的方法检查各参数是否正确,比起上面这些无效的错误提示还是方便很多。

 

 

 

 

 

接下来写一下smartUpload的处理

 

我这个写成了一个方法,但具体的内容差不多,


public
String getMusicPath(PageContext pageContext){ SmartUpload su = new SmartUpload(); String filedName = ""; try { su.initialize(pageContext);//初始化smartUpload su.setMaxFileSize(1024 *1024*30); //设置传送文件的大小 su.setCharset("utf-8"); //设置编码集

       su.setAllowedFilesList("mp3,mp4"); //设置要上传的后缀,以数组的方式提交,中间用逗号隔开,当然也可以只写一个后缀 su.upload();//上传 String basicPath
= pageContext.getRequest().getRealPath("/") + "..\\" + "lrcInfo" + "\\"; //这个是上传之后的文件要存放的路径
        //pageContext.getRequest().getRealPath("/")是获取当前项目的绝对路径
        
Files files
= su.getFiles(); Collection<File> fls = files.getCollection(); for(File fl : fls){ if(!fl.isMissing()){ //如果文件存在 filedName = fl.getFileName(); fl.saveAs(basicPath + filedName); //以这样的绝对路径存放 } } } catch (ServletException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SmartUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } return filedName; //这里是因为自己的业务需求返回的文件名 }

 

以上是关于如何在点击a标签下载文件的时候通过JavaScript动态的修改文件的名称?的主要内容,如果未能解决你的问题,请参考以下文章

json文件下载--防止chrome直接打开方案

模拟a标签,点击下载

二期项目总结 通过a标签打开文件上传选择框,使用Ajax上传文件

如何使用锚标签 <a> 下载文件

实现文件在线浏览和下载

a标签下载文件