2015-12-02 2 views
3

Я не знаю, возможно ли это, но вот чего я хотел бы достичь. Я хотел бы иметь возможность загружать файл JSON с помощью ввода файла, редактировать его на веб-странице, а затем сохранять изменения - это начальный файл. Я знаю, что по соображениям безопасности браузер не имеет полного доступа к диску, но мне было интересно, есть ли способ разрешить обновления для определенного файла.Редактировать и сохранять файл локально с помощью JS

В двух словах, поток будет

  1. Загрузите файл
  2. Редактировать это
  3. Сохраните изменения (перезаписи начальный один)

Я не забочусь о совместимость браузера, поэтому, если решение основано на конкретном API-интерфейсе браузера, для меня это достаточно хорошо.

Кроме того, я знаю об атрибуте download, но я стараюсь избегать «нормального» потока загрузки (всплывающее окно или файл, который выбрасывается, это папка «Загрузка»).

Заранее благодарен!

+0

_ «Кроме того, я знаю, о' download' атрибута, но я стараюсь, чтобы избежать „нормальный“ скачать поток»_ Является ли требование не использовать' download' атрибут? , или «Сохранить файл»? Как сохранить файл или сохранить его? См. Http://stackoverflow.com/questions/30563157/edit-save-self-modifying-html-document-format-generated-html-javascript – guest271314

+0

Это что-то для публики для использования или просто для вас лично? –

+0

«Как сохранить файл или сохранить его». Так же, например, кнопка «Сохранить» работает в MS Word. Я хочу сохранить в первоначально загруженном файле. Подумайте об этом как о различиях между «Сохранить как» и «Сохранить». Только для меня на данный момент, но если я могу заставить его работать, было бы неплохо поделиться им :) –

ответ

1

var input = document.querySelector("input[type=file]"); 
 
var text = document.querySelector("textarea"); 
 
var button = document.querySelector("input[type=button]"); 
 
var name; 
 

 
input.onchange = function(e) { 
 
    var reader = new FileReader(); 
 
    reader.onload = function(event) { 
 
    text.value = event.target.result; 
 
    button.disabled = false; 
 
    } 
 
    name = e.target.files[0].name; 
 
    reader.readAsText(new Blob([e.target.files[0]], { 
 
    "type": "application/json" 
 
    })); 
 
} 
 

 
button.onclick = function(e) { 
 
    e.preventDefault(); 
 
    var blob = new Blob([text.value], { 
 
    "type": "application/json" 
 
    }); 
 
    var a = document.createElement("a"); 
 
    a.download = name; 
 
    a.href = URL.createObjectURL(blob); 
 
    document.body.appendChild(a); 
 
    a.click(); 
 
    text.value = ""; 
 
    input.value = ""; 
 
    button.disabled = true; 
 
    document.body.removeChild(a); 
 
}
textarea { 
 
    white-space: pre; 
 
    width: 400px; 
 
    height: 300px; 
 
}
<form> 
 
    <input type="file" /> 
 
    <br /> 
 
    <textarea></textarea> 
 
    <br /> 
 
    <input type="button" disabled="true" value="Save" /> 
 
</form>

+0

это самое близкое к тому, чего я пытаюсь достичь, но это не переписывание исходного файла. если это вообще невозможно, ваше решение будет принято ... initialy, это больше похоже на вопрос «исследования» –

+0

_ «но это не переписывание исходного файла« _? Диалоговое окно «Сохранить файл» может добавить «(1)» к исходному имени файла, возможно, чтобы предотвратить перезапись файла пользователем, в то время как его можно удалить в диалоговом окне «Сохранить файл». После удаления '(1)' от предполагаемого имени файла пользователь может снова быть запрошен с помощью '' Файл с именем «abc.json» уже существует. Файл уже существует в «папке». Замена его перезапишет его содержимое. Чтобы предотвратить перезапись файла пользователем? Если поддерживать открытый редактор во время процесса, отредактированный файл должен быть обновлен как в редакторе, так и в файловой системе, если нажать «Сохранить», – guest271314

0

Рассмотрите возможность изучения FileSystem. Это только в Chrome в настоящее время и вряд ли будет поддерживаться в других браузерах.

+0

Если я хорошо понимаю, это похоже на «виртуальную» файловую систему. Есть ли способ загрузить физический файл в эту файловую систему? –

0

Местное хранилище? Сохраняет пары ключевых значений, которые будут сохраняться в переменных браузеров, но общая идея поддерживается браузерами Chrome, Firefox, Safari, Opera, IE. Вещи хранятся как строки, поэтому вы можете хранить информацию типа json как значение, а не разбивать json на множество элементов key/value.

Это не самый безопасный способ сделать это, но, вероятно, будет хорошо для предпочтений и даже состояния приложения, если вы не возражаете, что существует потенциал для того, чтобы что-то клиентская сторона настраивала значения.

Если пользователь хочет сохранить это, вы вызываете параметр загрузки/сохранения файла.

+0

Я хочу написать какой-то онлайн-редактор, и я думаю, что было бы очень неприятно предлагать диалог сохранения пользователю каждый раз, когда он хочет сохранить свой прогресс, но я согласен с тем, что LocalStorage может быть эффективным буфером во время выполнения, что будет аварийным. –