1

Javascript には、サーバーにファイルをアップロードして出力を取得できるスクリプトがあります。出力の 1 つのコンポーネントは、アップロードされたファイルの名前です。たとえば、出力名は次のようになります。

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

4 に答える 4

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);
于 2013-02-23T16:43:14.820 に答える
1

同じ名前のファイルが3つ以上ある可能性があります

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);
于 2013-02-23T16:43:38.860 に答える
0

正規表現ルートを経由することにした場合、これはタイトル文字列の最後に数字を見つけて、それを1ずつ増やします-

var title = "hello.pdf1"

if (title.match(/(\d+)$/)) {
    var number = parseInt(title.match(/(\d+)$/)[1],10) + 1;
} else {
    var number = "1";
}
于 2013-02-23T16:29:33.857 に答える
0

配列内にファイルを格納できませんか? このようなもの(フリーハンド):

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]));
于 2013-02-23T16:28:47.690 に答える