如果已使用名称,请附加一个数字?

时间:2013-02-23 16:06:53

标签: javascript jquery

在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正则表达式通常都不好。

有更好的方法吗?我应该以不同的方式索引文件名吗?

4 个答案:

答案 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";
}