Как сохранить файл на сервере
доброго всем! задача: взять файл ексель с клиента, кинуть на сервер и там сохранить, затем отбработать.
на клиенте получил, в двоичные данные преобразовал, на сервер передал, там получил двоичные данные, вопрос как сохранить его на сервере?
функция КаталогВременныхФайлов() получает каталог временных файлов у клиента, хотя и используется в процедуре НаСервере. Подскажите как это осуществить?
Если на сервера не будет Экселя, что тогда?
скажем админам поставить)
(1) Тогда можно вспомнить, что 1С файлы Excel читает.
(0) На файловой базе разработку ведем, да? Ну и зачем тебе каталог, когда можно сразу имя временного файла получить?
Одна из черепашек. обманывает.
И не надо пользоваться КаталогВременныхФайлов. Представь себе, что твою кучку кода запустят одновременно несколько сеансов. Пользуйся ПолучитьИмяВременногоФайла, она для этого и предназначена.
(4) балин сама функция и сформирует адрес на сервере?
(5) Гимли, она формирует путь там, где запущена.
(6) т.е. если я ее запущу в процедуре НаСервере, то и будет она сформирована на сервере?
(7) Ну не на сайте 1С же
спасибо, вроде получилось создал файлик в папке userv82 чет такое, т.е. не под моим пользаком, все доброй ночи
(9) Файл создаётся в темпе того пользователя, под которым работает сервер 1с
извиняюсь за дебильный вопрос: а как узнать на каком сервере выполняется код если у меня 5 серверов в кластере?
по этому все, что тут предлагали — это не верные советы.
почитайте рекомендации 1с на эту тему (на ИТС)
(11) ПолучитьИмяВременногоФайла — не верный совет?
Ну просвяти же нас, о гуру, светом правды-истины!
(11) http://its.1c.ru/db/v8std#content:2149184191:hdoc
Тебе, пожалуй, тоже полезно будет
(14) + ПолучитьИмяВременногоФайла нужно использовать только в рамках одного серверного вызова,
в рамках нескольких серверных вызовов контекст уже протухнет
(14) При чем тут вообще временное хранилище?
Поместил ты туда двоичные данные, получил, все гуд. Дальше твои действия какие?
(14) Тогда уж правильно — НачатьПомещениеФайла
(16) Он придумал за ТС себе проблему, что у него несколько серверных вызовов и героически с ней борется.
(16) дальше в рамках одной серверной процедуры можно запустить ексель, а вот получишь ли ты обратно этот файл из следующего серверного вызова будет зависить от контекста выполнения. По этому сабж должен или ждать внутри серверного вызова завершение чужеродного потока (что плохо), либо работать как-то по другому.
(17) нет, просто этот вопрос — классический завал в билетах 1с 🙂
(18) Я рекомендую тебе отдохнуть. Выпей кружечку хорошего пива, что ли.
(20) 2 недели на новой работе, может уже пора в отпуск?
(21) Пора-пора. Речь про пути к временным файлам, а ты про временное хранилище и серверные вызовы втираешь.
(14) не поможет. объект файл не передается, а двоичные данные да я получу, и ? надо ексель сохранить о чем собственно и вопрос
(23) Это слишком сложно для нас, прости.
(24) не прощаю! подскажи)
(25) Что именно? Как обработать — знаешь только ты. Для передачи надо на клиенте начать помещение файла с параметром — путем, получишь адрес в хранилище. С этим адресом идешь на сервер, извлекаешь по нему двоичные данные и сбрасываешь на диск. Дальше твои ёксельные фантазии.
(26) . С этим адресом идешь на сервер, извлекаешь по нему двоичные данные и сбрасываешь на диск.
вот в этом и вопрос, куда сохранить? всмысле как бы получить временную папку там на сервере, точно зная что будет доступна и т.д. и исходя из этого сохранить уже файл, дальше все понятно что мои фантазии. Как сгенерировать ПУТЬ для сохранения на сервере?
(27) Ты точно тему читаешь? Они тебе угрожают оружием?
ПолучитьИмяВременногоФайла
не помогло(
(29) Чем мотивировало?
(30) : Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается получить доступ к файлу «C:\Users\USR1CV82\AppData\Local\Temp\v8_CC39_28.xslx». Это может быть вызвано одной из следующих причин.
Форма.Форма.Форма(209)>
• Указан несуществующий файл или путь.
• Файл используется другой программой.
• Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент.
(31) Ставлю на вариант №1
(32) у меня еще опечатка в формате была, исправил, щас пойду админов спрашивать
капец затра***ся, ексель есть, файлик сохраняется не открывает и все, ну пздц
Права в дком на сервере поменять еще нужно.
Это удачно я зашел. У меня нет опыта управляемых форм и с файловой системой я тоже до этого не работал, а тут поставили задачу сделать возможность прикрепления к документу реализация товаров и услуг в УТ 11, файлов pdf. Файлы должны храниться на общем диске. Хорошо хоть сроков не стоит, есть время разобраться.
Вопрос: переносить файл в сетевой каталог обязательно использую серверные методы? Или есть возможность на клиенте все сделать, читать сам файл в 1с от меня не требуется. Просто дать информацию, есть у этого документа файлы или нет.
(37) сделай общий каталог до которого сможешь стучаться из любого места, и из 1с будешь получать свои файлы
(35) ок, с сохранением передачей разобрался, теперь просто не открывает, может быть из-за этого?
(1) Обычный таб док умеет читать ексель
В свое время делал загрузку данных из xls правда опять же на обычных формах. Использовал ADODB. Очень понравилось, что не требует установки excel на сервер, да и в инете оч много информации о методах.
Использовал функцию из инета для получения данных в тз.
Функция ЗагрузитьМетодом_MSADODB(Знач ФайлEXCEL, Знач ИмяЛиста, Знач СтрокаЗаголовка = 2, НачСтрока = 3, КонСтрока = 0,
Знач ПодключениеADODB = «MicrosoftJetOLEDB40») Экспорт
//ПустоеПодразделение = Справочники.Подразделения.ПустаяСсылка();
Если ПодключениеADODB = «MicrosoftACEOLEDB12» Тогда
СonnectionString = «Provider=Microsoft.ACE.OLEDB.12.0;Data Source= » + СокрЛП(ФайлEXCEL) + «;Extended Properties=»»Excel 12.0;HDR=YES;IMEX=1;»»»;
Иначе
СonnectionString = «Provider=Microsoft.Jet.OLEDB.4.0;Data Source= » + СокрЛП(ФайлEXCEL) + «;Extended Properties=»»Excel 8.0;HDR=YES;IMEX=1;»»»;
КонецЕсли;
Попытка
ADODBConnection = Новый COMОбъект(«ADODB.Connection»);
ADODBConnection.ConnectionString = СonnectionString;
ADODBConnection.Open();
ADODBConnection.CursorLocation = 3;
Исключение
Сообщить(НСтр(«ru = ‘»+ОписаниеОшибки()+»‘»), СтатусСообщения.Внимание);
Возврат Новый ТаблицаЗначений; КонецПопытки;
ТекстЗапроса = «SELECT * FROM [» + ИмяЛиста + «$]»;
Попытка
ADODBRecordset = Новый COMОбъект(«ADODB.Recordset»);
ADODBRecordset.Open(ТекстЗапроса, ADODBConnection);
Если (ADODBRecordset.EOF ИЛИ ADODBRecordset.BOF) Тогда
КолвоСтрокExcel = 0;
Сообщить(НСтр(«ru = ‘» + ИмяЛиста + «: не содержит данных.'»), СтатусСообщения.Внимание);
ADODBRecordset.Close();
ADODBConnection.Close();
ADODBRecordset = Неопределено;
ADODBConnection = Неопределено;
Возврат Новый ТаблицаЗначений;
КонецЕсли;
ADODBRecordset.AbsolutePage = 1;
ADODBRecordset.AbsolutePosition = 1;
Исключение
Сообщить(НСтр(«ru = ‘»+ОписаниеОшибки()+»‘»), СтатусСообщения.Внимание);
Возврат Новый ТаблицаЗначений;
КонецПопытки;
КолвоСтрокExcel = ADODBRecordset.RecordCount + 1;
КолвоКолонокExcel = ADODBRecordset.Fields.Count;
Если КолвоСтрокExcel КолвоСтрокExcel = 0;
Сообщить(НСтр(«ru = ‘» + ИмяЛиста + «: не содержит данных.'»), СтатусСообщения.Внимание);
ADODBRecordset.Close();
ADODBConnection.Close();
ADODBRecordset = Неопределено;
ADODBConnection = Неопределено;
Возврат Новый ТаблицаЗначений;
КонецЕсли;
ТаблицаРезультат = Новый ТаблицаЗначений;
ТаблицаРезультат.Колонки.Добавить(«НомерСтроки», Новый ОписаниеТипов(«Число»), «№», 4);
ТаблицаРезультат.Колонки.Добавить(«Сопоставлено», Новый ОписаниеТипов(«Булево»), «Сопоставлено», 1);
Для ит = 1 ПО КолвоКолонокExcel Цикл
Поле = ADODBRecordset.Fields.Item(ит — 1);
ИмяКолонки = «К_» + ит;
Если ИмяКолонки = «К_1» Тогда
Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки,Новый ОписаниеТипов(«Число») , СокрЛП(СтрЗаменить(Поле.Name, «#», «.»)));
ИначеЕсли ИмяКолонки = «К_2» Тогда
Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки,Новый ОписаниеТипов(«Дата») , СокрЛП(СтрЗаменить(Поле.Name, «#», «.»)));
ИначеЕсли ИмяКолонки = «К_3» Тогда
Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки,Новый ОписаниеТипов(«Строка») , СокрЛП(СтрЗаменить(Поле.Name, «#», «.»)));
ИначеЕсли ИмяКолонки = «К_5» Тогда
Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки,Новый ОписаниеТипов(«Строка») , СокрЛП(СтрЗаменить(Поле.Name, «#», «.»)));
ИначеЕсли ИмяКолонки = «К_6» Тогда
Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки,Новый ОписаниеТипов(«Число») , СокрЛП(СтрЗаменить(Поле.Name, «#», «.»)));
ИначеЕсли ИмяКолонки = «К_7» Тогда
Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки,Новый ОписаниеТипов(«Число») , СокрЛП(СтрЗаменить(Поле.Name, «#», «.»)));
Иначе
Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки, , СокрЛП(СтрЗаменить(Поле.Name, «#», «.»)));
КонецЕсли;
КонецЦикла;
НоваяСтрока = ТаблицаРезультат.Добавить();
НоваяСтрока.НомерСтроки = 1;
Для ит = 1 ПО КолвоКолонокExcel Цикл
ИмяКолонки = «К_» + ит;
Колонка = ТаблицаРезультат.Колонки.Найти(ИмяКолонки);
НоваяСтрока[ИмяКолонки] = Колонка.Заголовок;
КонецЦикла;
НомерСтроки = 1;
Пока ADODBRecordset.EOF() = 0 Цикл
НомерСтроки = НомерСтроки + 1;
Если НомерСтроки < НачСтрока Тогда
ADODBRecordset.MoveNext();
Продолжить;
КонецЕсли;
Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда
Прервать;
КонецЕсли;
НоваяСтрока = ТаблицаРезультат.Добавить();
НоваяСтрока.НомерСтроки = НомерСтроки;
Для ит = 1 ПО КолвоКолонокExcel Цикл
Поле = ADODBRecordset.Fields.Item(ит — 1);
Если Поле.ActualSize = 0 Тогда
Продолжить;
КонецЕсли;
ЗначениеЯчейки = Поле.Value;
ИмяКолонки = «К_» + ит;
НоваяСтрока[ИмяКолонки] = ЗначениеЯчейки;
ШиринаКолонки = ТаблицаРезультат.Колонки[ИмяКолонки].Ширина;
ДлинаСтроки = СтрДлина(СокрЛП(ЗначениеЯчейки));
ТаблицаРезультат.Колонки[ИмяКолонки].Ширина = ?(ШиринаКолонки < ДлинаСтроки, ДлинаСтроки, ШиринаКолонки);
КонецЦикла;
ADODBRecordset.MoveNext();
КонецЦикла;
ADODBRecordset.Close();
ADODBConnection.Close();
ADODBRecordset = Неопределено;
ADODBConnection = Неопределено;
ТаблицаРезультат.Удалить(ТаблицаРезультат[0]);
Возврат ТаблицаРезультат;
Вот так список листов вычислял, и передавал нужный лист в ту функцию.
Процедура ФайлExcelПолучитьСписокЛистов(Знач ФайлEXCEL, Знач ПодключениеADODB = «MicrosoftJetOLEDB40»)
СписокЛистов = Новый СписокЗначений;
Файл = Новый Файл(ФайлEXCEL);
Если ВРег(Файл.Расширение) = «.XLS» ИЛИ ВРег(Файл.Расширение) = «.XLSX» Тогда
Если ПодключениеADODB = «MicrosoftACEOLEDB12» Тогда
СonnectionString = «Provider=Microsoft.ACE.OLEDB.12.0;Data Source= » + СокрЛП(ФайлEXCEL) + «;Extended Properties=»»Excel 12.0;HDR=YES;IMEX=1;»»»;
Иначе
СonnectionString = «Provider=Microsoft.Jet.OLEDB.4.0;Data Source= » + СокрЛП(ФайлEXCEL) + «;Extended Properties=»»Excel 8.0;HDR=YES;IMEX=1;»»»;
КонецЕсли;
Попытка
ADODBConnection = Новый COMОбъект(«ADODB.Connection»);
ADODBConnection.Open(СonnectionString);
ADOXCatalog = Новый COMОбъект («ADOX.Catalog»);
ADOXCatalog.ActiveConnection = ADODBConnection;
МассивЛистов = ADOXCatalog.Tables;
Для Каждого ЛистМассива ИЗ МассивЛистов Цикл
пИмяЛиста = ЛистМассива.Name;
Если пИмяЛиста = «Excel_BuiltIn_Database» Тогда
Продолжить;
КонецЕсли;
Если Прав(пИмяЛиста,1) = «$» Тогда
ЭлементыФормы.ИмяЛиста.СписокВыбора.Добавить(Лев(пИмяЛиста, СтрДлина(пИмяЛиста)-1));
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
ADOXCatalog = Неопределено;
ADODBConnection.Close();
ADODBConnection = Неопределено;
Исключение
Сообщить(НСтр(«ru = ‘»+ОписаниеОшибки()+»‘»), СтатусСообщения.Внимание);
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Добрый день. Не хочу плодить тему, поэтому задам свой вопрос тут. У меня при попытке создания каталога выдает ошибку.
: Ошибка при вызове метода контекста (СоздатьКаталог): Ошибка создания каталога: Ошибка доступа к файлу ‘Файл’. 5(0x00000005): Отказано в доступе.
Функция вот такая:
&НаКлиенте
Функция ПроверитьСуществованиеКаталогаДома(Дом, КаталогАрхива)
КаталогДома = КаталогАрхива+»\»+Дом;
ПапкаДома = Новый Файл(КаталогДома);
Если Не ПапкаДома.Существует() Тогда
Ответ = Вопрос(«Папка: «+Дом+» не существует в каталоге: «+КаталогАрхива+»\»+» создать ее?»,РежимДиалогаВопрос.ОКОтмена);
Если Ответ = КодВозвратаДиалога.ОК Тогда
Попытка
СоздатьКаталог(ПапкаДома);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции
Я лично думаю, раз функция клиентская, то наверное она для создания каталога использует права пользователя, от которого у меня запущена 1С. У этого пользователя как не странно полные права, админ домена. В чем прикол? Может есть какой-нибудь способ в 1С задать учетку под которой будет производиться создание каталога?
Забыл дописать, база запускается локально с моего компа, мой комп в домене, сервер 1с на другом компе, который не в домене, база sql на третьем компе, который в домене. =)
Я тут подумал, пожалуй лучше разместить каталог архива на терминальном сервере, там не потребуются права доменные.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший
Как сохранить JSON на сервере
Мы уже научились отправлять на сервер и принимать обратно данные в JSON-формате. Финальный шаг — будем хранить все наши данные на сервере, чтобы получить доступ к ним с любого устройства. Это поможет нам делать проекты независимыми от локального хранилища.
Как это будет работать
Мы возьмём код из прошлого проекта про отправку JSON на сервер и добавим в него новые возможности.
Логика будет такая:
- Мы научим сервер каждый раз запоминать данные, которые отправит ему наша страница. Чтобы убедиться, что данные в порядке, мы сразу же в ответ будем посылать результат — то, как сервер это запомнил.
- После этого мы поработаем с данными от сервера в понятном для JavaScript виде. Для этого мы немного их поменяем и отправим обратно на сохранение. Это поможет нам понять, как работать с данными в других проектах.
Мы специально используем самые простые и не самые лучшие конструкции в PHP и JavaScript. Наша цель — собрать быстрый прототип и показать, как можно обмениваться данными с сервером. Когда разберёмся с этим, можно и код пооптимизировать. А пока так.
Сохраняем JSON в файл на сервере
Сейчас работает так — по нажатию на кнопку «Проверить JSON» наша страница отправляет на сервер JSON-строку с двумя ключами: именем и фамилией. Новая задача сервера — сохранять себе все полученные данные и отправлять их обратно на страницу. Чтобы данные не потерялись после окончания работы программы, будем сохранять их на сервере в файл json.data . Мы выбрали такое название, но вы можете взять любое другое, имя файла ни на что не влияет.
Так как по нажатию этой кнопки страница обращается на сервере к файлу json.php, то и изменять тоже нужно именно его. Сделаем так:
- Получаем данные от страницы (это уже сделано в прошлом проекте).
- Проверяем, есть ли на сервере нужный нам файл с данными — json.data.
- Если есть — запоминаем его содержимое, а если такого файла нет — создаём его отдельной командой.
- Всё, что было в этом файле, переводим в массив, с которым умеет работать PHP. Таким способом у нас каждая JSON-запись будет храниться в отдельной ячейке массива.
- Добавляем новую запись в этот массив — кладём в него то, что пришло со страницы.
- Записываем это всё обратно в файл и тут же читаем обратно из него — так мы убедимся, что запись прошла нормально и мы можем с этим работать.
- Отправляем всё содержимое файла на страницу, чтобы там увидеть, что сервер работает как нужно.
Задача этого алгоритма — сохранять данные на сервере и отдавать их обратно на страницу. На языке PHP то же самое будет выглядеть так:
else < // …то создаём его сами $file = fopen("data.json", "a+"); >// 4/ Всё, что было в этом файле, переводим в массив, с которым умеет работать PHP. Таким способом у нас каждая JSON-запись будет храниться в отдельной ячейке массива. $taskList = json_decode($file, true); // 5. Добавляем новую запись в этот массив — кладём в него то, что пришло со страницы. $taskList[] = array($data); // 6. Записываем это всё обратно в файл и тут же читаем обратно из него — так мы убедимся, что запись прошла нормально и мы можем с этим работать. // Записываем данные в файл… file_put_contents('data.json', json_encode($taskList)); // …и сразу считываем их обратно $file = file_get_contents('data.json'); // Открыть файл data.json // 7. Отправляем всё содержимое файла на страницу, чтобы там увидеть, что сервер работает как нужно. echo $file; // Освобождаем память от переменных, которые нам пока не нужны unset($file); unset($taskList);
Обратите внимание на последние строки в коде — мы освобождаем память на сервере, чтобы она не хранила те переменные, которые нам уже не нужны. Зачем это делать и что будет, если этого не делать, — почитайте в статье про сборщики мусора.

Подготавливаем страницу
Теперь научим нашу страницу правильно обрабатывать ответ от сервера и работать с полученными данными. Для этого нам нужно:
- Преобразовать сырые данные, полученные от сервера, в вид, понятный для JavaScript.
- Любым образом поменять их значения.
- Отправить изменённые данные назад на сервер.
- Получить сразу их обратно и вывести на экран, чтобы убедиться, что сервер правильно понял все изменения.
Перед тем как работать с полученными данными в JavaScript, нам нужно их куда-то сохранить. Для этого в самом начале скрипта заведём новую переменную res , и добавим в функцию sendJSON() такую строку:
// запоминаем данные, которые пришли с сервера
res = this.responseText;
// выводим то, что ответил нам сервер —
так мы убедимся, что данные он получил правильно
result.innerHTML = this.responseText;
Теперь в этой переменной у нас будут лежать сырые данные, которые отправит нам сервер.
Чтобы мы могли отдельно управлять всеми изменениями, добавим в наш HTML-файл с прошлого проекта новую кнопку рядом с первой:
Сделаем функцию editJSON(), которая сработает по нажатию на эту кнопку. Работать она будет так:
- Возьмёт сырые данные от сервера и преобразует их в формат, понятный для JavaScript.
- Найдёт все имена, посчитает количество символов в них и допишет это число к имени. Так мы поймём, что данные можно менять как нам нужно.
- Преобразует всё это обратно в JSON и отправит на сервер.
- На всякий случай снова выведет результат на странице, чтобы мы убедились, что на сервере лежат уже новые данные.
Чтобы не писать код заново, мы скопируем уже существующую функцию sendJSON(), переименуем её в editJSON() и добавим в неё то, что нам нужно. А перед этим в самом начале скрипта снова добавим две новые переменные:
- newData , где мы будем хранить данные в понятном формате;
- sendData , куда мы поместим новую JSON-строку перед отправкой на сервер.
Что мы делаем с JSON, полученным с сервера
Перед тем как показать финальный код, поясним один момент. Мы переводим данные с сервера в формат для JavaScript командой
В результате мы получаем двумерный массив, с которым можно работать так:
newData[3][0].lastname = ‘Привет’;
Дело тут вот в чём: первая цифра в квадратных скобках отвечает за порядковый номер JSON-записи, которые мы отправляли на сервер. Нумерация идёт с нуля, как принято у программистов.
Вторая цифра у нас всегда 0, потому что хотя это и двумерный массив, но каждая запись состоит всего из одного элемента. Так как нумерация с нуля, то мы и пишем 0.
После этого через точку идёт имя поля — у нас это name и lastname. Через них мы можем обращаться к конкретным значениям и менять в них что угодно.
Такая громоздкость получилась из-за того, что мы решили проблему в лоб — просто перевели данные с помощью встроенных средств языка. Это можно было сделать гораздо красивее, но так — быстрее.
Сам код новой функции:
function editJSON() < // переводим данные от сервера в массив, понятный для JavaScript newData = JSON.parse(res).map(Object.values); // добавляем к каждому имени число с его длиной в скобках for (var i = newData.length - 1; i >= 0; i--) < newData[i][0].name = newData[i][0].name + '(' + newData[i][0].name.length + ')'; console.log(newData[i][0].name); >// а вот сюда мы поместим ответ от сервера let result = document.querySelector('.result'); // создаём новый экземпляр запроса XHR let xhr = new XMLHttpRequest(); // адрес, куда мы отправим нашу JSON-строку let url = "http://mihailmaximov.ru/projects/json/edit.php"; // открываем соединение xhr.open("POST", url, true); // устанавливаем заголовок — выбираем тип контента, который отправится на сервер, в нашем случае мы явно пишем, что это JSON // xhr.setRequestHeader("Content-Type", "application/json"); // когда придёт ответ на наше обращение к серверу, мы его обработаем здесь xhr.onreadystatechange = function () < // если запрос принят и сервер ответил, что всё в порядке if (xhr.readyState === 4 && xhr.status === 200) < // выводим то, что ответил нам сервер — так мы убедимся, что данные он получил правильно result.innerHTML = this.responseText; >>; // преобразуем наши новые данные в JSON-строку sendData = JSON.stringify(newData); // когда всё готово, отправляем JSON на сервер xhr.send(sendData); >
Делаем новый PHP-обработчик на сервере
В скрипте мы обращались к файлу edit.php, которого у нас ещё нет. Всё, что нужно от этого файла, — чтобы он сохранил то, что ему пришло, и тут же отправил это обратно, чтобы мы убедились, что всё хорошо. Мы специально выносим такую простую функцию в отдельный файл, чтобы каждый из них отвечал за свою область работы.
Сам файл довольно прост:

Что дальше
Теперь у нас всё готово, чтобы переделать наши старые проекты и научить их хранить свои данные в облаке. Этим и займёмся.
Файл json.html
Отправляем JSON-данные на сервер Простая форма для проверки работы JSON
Файл json.php
else < // …то создаём его сами $file = fopen("data.json", "a+"); >// 4/ Всё, что было в этом файле, переводим в массив, с которым умеет работать PHP. Таким способом у нас каждая JSON-запись будет храниться в отдельной ячейке массива. $taskList = json_decode($file, true); // 5. Добавляем новую запись в этот массив — кладём в него то, что пришло со страницы. $taskList[] = array($data); // 6. Записываем это всё обратно в файл и тут же читаем обратно из него — так мы убедимся, что запись прошла нормально и мы можем с этим работать. // Записываем данные в файл… file_put_contents('data.json', json_encode($taskList)); // …и сразу считываем их обратно $file = file_get_contents('data.json'); // Открыть файл data.json // 7. Отправляем всё содержимое файла на страницу, чтобы там увидеть, что сервер работает как нужно. echo $file; // Освобождаем память от переменных, которые нам пока не нужны unset($file); unset($taskList);
Как сохранить файл на сервере
Доброго времени суток!
Возможно ли программно (vba) сохранять открый excel файл на сервере, причем под опеределенным пользователем и паролем.
Нужно для резервных копий. Насколько я знаю в функциях Save и SaveAs нет таких возможностей 🙁
02.09.2009 18:06:59
Подскажите пожалуйста, что значит сохранять открый excel файл под опеределенным пользователем?
А вообще, чтобы при сохранении файла произвести над ним дополнительные действия можно воспользоваться процедурой книги Workbook_BeforeSave
Пользователь
Сообщений: 4 Регистрация: 01.01.1970
02.09.2009 18:12:32
Т.е. пользователь откывает файл, при открытии запускается команда на копирование файла на сервер. Причем нужно копировать в расшаренную папку, доступа к которой у пользователя быть не должно.
Может есть такая конструкция в VBA, которая может это реализовать? Естетственно пользователя и его пароль я постараюсь потом из текста VBA скрыть.
02.09.2009 18:37:55
Сомневаюсь, что удасться сохранить файл в папку в которую у пользователя нет доступа.
Единственное, что приходит на ум — чтобы пользователь не подозревал о существовании этой папки.
И тогда:
Private Sub Workbook_Open()
ThisWorkbook.SaveCopyAs «C:\Новая папка\111.xls» ‘ну или куда вам нравится
End Sub
а вечером копировать все туда, докуда пользователь действительно не дотянется
Получение файлов с сервера и размещение файлов на сервере
Получение файлов с сервера, размещение файлов на сервере и управление передачей файлов с использованием Dreamweaver.
При работе с другими пользователями используйте систему возврата и извлечения с сервера для передачи файлов между локальными и удаленными сайтами. Если вы — единственный пользователь, работающий на удаленном сайте, команды «Получить» и «Разместить» можно использовать для передачи файлов без их извлечения или возврата.
Дополнительные сведения о возврате и извлечении файлов см. в разделе Возврат и извлечение файлов.
При передаче документа между локальной и удаленной папкой при помощи панели «Файлы» есть возможность передавать зависимые файлы документа. Зависимые файлы — это изображения, внешние таблицы стилей и другие файлы, связанные с документом, которые загружаются браузером при загрузке документа.
Примечание.
Как правило, рекомендуется загружать зависимые файлы при извлечении нового файла, но если самые последние версии зависимых файлов уже имеются на локальном диске, нет необходимости загружать их снова. Это также касается загрузки и возврата файлов: в этих действиях нет необходимости, если обновленные копии файлов уже есть на удаленном сайте.
Элементы библиотеки рассматриваются как зависимые файлы.
Некоторые серверы выдают сообщения об ошибках при размещении элементов библиотеки. Однако эти файлы можно скрыть, чтобы они не передавались.
О передаче файлов в фоновом режиме
Во время получения или размещения файлов можно выполнять действия, не относящиеся к серверу. Передача файлов в фоновом режиме работает для всех протоколов передачи, поддерживаемых Dreamweaver: FTP, SFTP, LAN, WebDAV и RDS.
Действия, не относящиеся к серверу, включают стандартные операции, например ввод сведений, редактирование внешних таблиц стилей, создание отчетов по всему сайту, создание новых сайтов.
Существует ряд связанных с сервером действий, выполнить которые во время передачи файлов Dreamweaver не может:
- Размещение, получение, извлечение и возврат файлов на сервер.
- Отмена возврата.
- Создание подключения к базе данных.
- Связывание динамических данных.
- Просмотр данных в интерактивном просмотре
- Вставка веб-службы.
- Удаление файлов или папок удаленного сервера.
- Просмотр в браузере на тестовом сервере.
- Сохранение файла на удаленном сервере.
- Вставка изображения с удаленного сервера.
- Открытие файла, расположенного на удаленном сервере.
- Автоматическое размещение файлов при сохранении.
- Перетаскивание файлов на удаленный сервер.
- Вырезание, копирование или вставка файлов на удаленном сервере.
- Обновление удаленного представления.
По умолчанию во время передачи файла открывается диалоговое окно «Фоновая обработка файлов». Его можно свернуть, нажав кнопку «Свернуть» в верхнем правом углу. Закрытие диалогового окна во время передачи файла приводит к отмене операции.
Получение файлов с удаленного сервера
Скопировать файлы с удаленного сайта на локальный сайт можно одним из следующих способов:
- Получение файлов с удаленного сервера при помощи панели «Файлы»
- Получение файлов с удаленного сервера при помощи области «Окно документа»
Dreamweaver создает журнал активности файлов во время передачи, который можно просмотреть и сохранить.
Примечание.
Невозможно отключить передачу файлов в фоновом режиме. Если в диалоговом окне «Фоновая обработка файлов» открыт подробный журнал, то для повышения быстродействия его можно закрыть.
Dreamweaver также фиксирует все операции по передаче файлов через FTP. Если при передаче файла с сервера FTP возникает ошибка, журнал сайта FTP может помочь определить проблему.
Получение файлов с удаленного сервера при помощи панели «Файлы»
На панели «Файлы» (Окно > Файлы) выберите файлы, которые нужно загрузить.
Как правило, эти файлы выбираются в удаленном представлении, но, если необходимо, файлы можно выбрать и в локальном представлении. Если включено удаленное представление, Dreamweaver копирует выбранные файлы на локальный сайт; если включено локальное представление, Dreamweaver копирует удаленные версии выбранных файлов на локальный сайт.
Примечание.
Чтобы получить только те файлы, удаленные версии которых являются более новыми по сравнению с локальными версиями, выберите параметр «Синхронизировать».
Чтобы получить файл, выполните одно из следующих действий.
- На панели инструментов панели «Файлы» нажмите кнопку «Получить».
- Правой кнопкой мыши (в Windows) или кнопкой Control (в Macintosh) щелкните файл и выберите команду «Получить» в контекстном меню.
В диалоговом окне «Зависимые файлы» нажмите кнопку «Да», чтобы загрузить зависимые файлы; если локальные копии файлов уже имеются в наличии, нажмите кнопку «Нет». По умолчанию зависимые файлы не загружаются. Это можно сделать через меню «Правка» > «Настройки» > «Веб-сайт».
Dreamweaver загружает выбранные файлы следующим образом.
- если используется система возврата и извлечения с сервера, будет получена локальная копия файла с правами только для чтения. При этом файл будет доступен на удаленном сайте или тестовом сервере для извлечения другими членами команды.
- Если система возврата и извлечения с сервера не используется, будет получена копия файла с правами чтения и записи.
Примечание.
При работе в совместной среде, то есть, когда с этими файлами работают и другие пользователи, не следует отключать функцию «Включить извлечение и возврат файлов». Если другие пользователи используют систему возврата и извлечения с сервера с этим сайтом, вы также должны ее использовать.
Передачу можно в любой момент прервать, нажав кнопку «Отмена» в диалоговом окне «Фоновая обработка файлов».