在Javascript中,我有一个脚本,允许我将文件上传到我的服务器,然后检索输出。输出的一个组件是上载的文件的名称。例如,输出名称可能如下所示:
test.pdf
然后test.pdf
的内容会保存到localStorage
键,项目名称为文件名称:localStorage.setItem(name, data)
。
这样可以正常工作,但是当文件的名称与正在上传和检索的文件的名称相同时则不行。
我的意思是,如果用户上传名为Hello 34.pdf
的文件,它会将该文件的名称和内容保存到LS键。但是,如果他们再次上传相同的文件,或者使用相同名称的其他文件,则它将使用相同的名称替换当前文件。
为了解决这个问题,我需要能够在文档标题的末尾附加一个数字,这样你就可以在LS中拥有同名文件的多个版本。
我知道我可以查看该文件是否与已经上传的文件同名:
var title = $('#file')[0].files[0]["name"];
if (localStorage.getItem(title)) {
alert("same name");
}
localStorage.setItem(title, data);
但是从那里我无法弄清楚如何在最后添加一个数字。我不认为正则表达式是一种合适的方法,因为:
if (title.match(/[\.pdf ]\d/g) != null) {
var number = title.match(/[\.pdf ]\d/g) + 1;
} else {
var number = "1";
}
依赖于.pdf
扩展名,而JS正则表达式通常都不好。
有更好的方法吗?我应该以不同的方式索引文件名吗?
答案 0 :(得分:1)
由于localStorage将所有项目存储为字符串,因此开发人员会跟踪用于索引该数据的密钥。上传时,实际文件不会重复;只有密钥才会重复。
这就是说我只会为每个上传的文件附加一个唯一的ID:
fileName = test.pdf
fileKey = test.pdf#1
然后将文件名存储在本地存储中作为键,值将是您现在所用的“版本”,例如:
localStorage.setItem("test.pdf", "1");
然后,您可以为每个新版本增加该值,并轻松获取下一版本的密钥,并将文件存储在本地存储中,如下所示:
localStorage.setItem("test.pdf#1", "file data here");
这有意义吗?
编辑(示例):
- 存储数据:
var title = $('#file')[0].files[0]["name"];
var revNo = 1;
if (localStorage.getItem(title)) {
revNo = localStorage.getItem(title);
revNo++;
}
localStorage.setItem(title, revNo);
localStorage.setItem(title + "#" + revNo, data);
- 要检索数据:
var title = $('#file')[0].files[0]["name"];
var revNo = 1;
if (localStorage.getItem(title)) {
revNo = localStorage.getItem(title);
}
// get the latest revision
var data = localStorage.getItem(title + "#" + revNo);
答案 1 :(得分:1)
您可能有两个以上同名的文件
var title= $('#file')[0].files[0]["name"];
if(localStorage.getItem(title)){
var n= 1;
while(localStorage.getItem(title+n)) n+= 1;
title= title+n;
}
localStorage.setItem(title, data);
答案 2 :(得分:0)
您不能将文件存储在数组中吗?这样的事情(freehanded):
if (localStorage.getItem(title)) {
var files = JSON.parse(localStorage[title]);
files.push(data);
localStorage.setItem(title, JSON.stringify(files);
} else
localStorage.setItem(title, JSON.stringify([data]));
答案 3 :(得分:0)
如果您决定通过RegEx路线,这会在标题字符串的末尾找到一个数字,然后将其递增1 -
var title = "hello.pdf1"
if (title.match(/(\d+)$/)) {
var number = parseInt(title.match(/(\d+)$/)[1],10) + 1;
} else {
var number = "1";
}