Содержание
- Цена решения проблемы
- Какую 1С выбрать?
- Сопровождение и обслуживание 1С
- Доступ к выбранным файлам
- Получение информации о выделенных файлах
- Использование метода click() скрытых элементов выбора файла
- Использование элемента label скрытого элемента input
- Выбор файлов с использованием технологии drag and drop
- Пример: Отображение эскизов изображений, выбранных пользователем
- Использование URLs объктов
- Пример: Использование URL объектов для отображения изображений
- Пример: Загрузка файла, выбранного пользователем
- Пример: Использование URL объектов для отображения PDF
- Пример: Использование URL объектов с другими типами файлов
569 пользователя считают данную страницу полезной. Информация актуальна! Страница была обновлена 16.12.2019
1. Создать справочник для хранения присоединенных файлов. Для этого в качестве заготовки скопировать в конфигурацию справочник _ДемоПроектыПрисоединенныеФайлы из демонстрационной конфигурации и задать ему имя по шаблону:
где – имя объекта метаданных, для которого настраиваются присоединенные файлы. Например, для справочника Номенклатура справочник с файлами должен называться НоменклатураПрисоединенныеФайлы. Задать синоним, например: Присоединенные файлы (Номенклатура).
2. У реквизита ВладелецФайла установить тип – «объект с файлами». Например, СправочникСсылка.Номенклатура.
3. Включить в состав определяемых типов ПрисоединенныйФайл (ссылки) и ПрисоединенныйФайлОбъект (объекты) справочник, созданный на шаге 1. Например, СправочникСсылка.НоменклатураПрисоединенныеФайлы.
4. Расширить состав определяемых типов ВладелецПрисоединенныхФайлов (ссылки) и ВладелецПрисоединенныхФайловОбъект (объекты, кроме документов), добавив в него тип «объект с файлами». Например СправочникСсылка.Номенклатура.
5. Расширить состав типов свойства Источник у подписки ПереопределитьПолучаемуюФормуПрисоединенногоФайла, включив в него тип – справочник с файлами, созданный на шаге 1. Например, СправочникМенеджер.НоменклатураПрисоединенныеФайлы.
6. Расширить состав типов свойства Источник подписки УстановитьПометкуУдаленияПрисоединенныхФайловДокументов, включив в него тип – «объект с файлами» (только документы). Например, ДокументОбъект.СчетНаОплатуПокупателю.
7. Если при интерактивном копировании объекта, содержащего присоединенные файлы, требуется их автоматическое копирование в новый объект, то в форме объекта необходимо:
● в параметры формы добавить ключевой параметр ЗначениеКопирования такого же типа, как и сам объект;
● в модуле формы в процедуру ПриЗаписиНаСервере вставить следующий код:
Цена решения проблемы
Если ошибка при добавлении присоединенного файла 1С – обычно цена решения проблемы 1000-1500p. но чтобы дать конечную оценку, надо смотреть и уточнять детали. просто позвоните!
Мои 1С услуги
- Решение когда ошибка при добавлении присоединенного файла 1С
- Установка и настройка программы 1С Предприятие
- Загрузка товаров в 1С из Excel (эксель), dbf, xml, txt и т.д.
- Обучение – курсы по работе с 1С
- Обновление 1С (версии 7.7, 8.1, 8.2 и 8.3) Создание отчетов и доработок в 1С
- Исправление и восстановление баз 1С
- Сброс забытых паролей
Быстрое обучение 1С
простым языком
Доступная автоматизация
на базе 1С
Экспресс внедрение
1С за 2 ч.
Сделаю в 1С то
что нужно именно Вам!
Наименование услуги | Стоимость |
---|---|
Ошибка при добавлении присоединенного файла 1С | от 1000 руб. |
Помощь в решение именно ВАШЕЙ задачи | от 300р. |
Подготовка 1С к маркировки (одежды и обуви) | от 1500р. | Облачная 1С Предприятие 8.3 | от 700 руб. в месяц |
Обучение 1С (план обучения) | от 4000 руб. |
Торговое оборудование | |
Настройка онлайн кассы | от 1200 руб. |
Настройка ЕГАИС в 1С | от 800 руб. |
Настройка сканера штрих-кода | 1000 руб. |
Подключение эквайринговых терминалов к 1С | 1000 руб. |
Настройка принтера этикеток, дисплея покупателя, весов, ТСД и т.д | от 600 руб. |
Обновление 1С | |
При заказе обновления, проверка базы на ошибки | БЕСПЛАТНО |
Обновление типовой базы 1С | 800 руб. |
Доработка 1C | |
Создание нового документа в 1С | от 1 500 руб. |
Создание нового справочника 1С | от 800 руб. |
Разработка новой печатной формы 1С | от 1000 руб. |
Сопровождение (обслуживание) 1С Предприятие | см. тарифы |
Ускорение работы компьютера (чистка от мусора) | 2000 руб. |
Проверка компьютера на вирусы – 2500 руб. | БЕСПЛАТНО (если вирусов не найду) |
Ускорение работы базы 1C (чистка и оптимизация) | по договору |
Сканер штрих-кода 2D (бесплатная доставка) | 3500 руб. шт. (видео обзор сканера) |
Продажа 1С Предприятие 8.3 | от 3300р. (лицензия, подробнее) |
Создание сайта | по договору |
Загрузка товаров в 1С из Excel | от 1500 руб. |
Цена часа работ | 600 руб.* |
Сравнение цены часа работ, это боль и слезы 1С.
Программист с опытом 15 лет – который может за 5 мин. рассказать главбуху «Газпрома» на каком счете «раки зимуют» и программист с опытом 1 год – в фирме Х стоят ОДИНАКОВО!
Как такое возможно?
Всё для клиента, всё для того чтобы он был доволен, но:
– Вы знаете какой программист решает вашу задачу? С опытом 10 лет или 1 год?
– А знаете ли вы, сколько действительно нужно времени на решение задачи?
– Может вы знаете с какой скоростью печатает программист?
– А еще лучше – вспомните профессию где оплата по часам, и где выгодно все сделать максимально быстро?
Вам еще не смешно?)
Какую 1С выбрать?
Ваша сфера деятельности:
Магазин розничный
Оптовая торговля
Опт и розница
Производство и торговля
Автосервис
Другое
Сколько человек ОДНОВРЕМЕННО работает в 1С?
Под ваши требования подходит
Конфигурация 1С
*Перед покупкой проконсультируйтесь с специалистом
Мои клиенты, в основном это компании в сфере торговли. Которые обращаются по оперативным работам в 1С и когда ошибка при добавлении присоединенного файла 1С.
Мои готовые модули (для автомобильной отрасли) можно посмотреть здесь: www.auto-soft-lab.ru.
Любой модуль можно адаптировать для любой сферы бизнеса.
Сопровождение и обслуживание 1С
Тариф | Стоимость |
---|---|
Только обновление 1С – одной базы №1 | бесплатно (при покупке ИТС на год) |
Только обновление 1С – одной базы №2 | 3000р. в квартал |
Обновление нескольких баз 1С | 800р. за одну базумес |
Обновление нескольких баз 1С + консультации | 6000р.мес |
Обновление нескольких баз 1С + консультации + доработки | по договору |
- Специалист 1С с общим опытом программирования более 15 лет (Delphi, Java, PHP, JS, 1C) т.е. знаю много способов решения задачи.
Всегда на связи – т.е. всегда можно дозвониться, а ответ на email – менее 15 мин.
Предлагаю готовые решения – а не изобретаю каждый раз велосипед.
Занимаюсь автоматизацией ТОРГОВЛИ – т.е. у меня есть специализация, а не «берусь за все, делаю как могу».
Когда ошибка при добавлении присоединенного файла 1С – решаю проблему!
Вывод: делайте копии 1С ежедневно или закажите сопровождение 1С.
Для надежной работы 1С рекомендую следующие работы:
- Создание резервных копий – каждый день
- Проверка базы на ошибки – раз в неделю
- Обновление базы – раз в месяца
- Свертка базы (для уменьшения ее объема) – раз в год
Я провожу индивидуальное обучение ! Обучение занимает 3-4 часа, поверьте моему опыту, этого достаточно чтобы научиться работать в 1С. Далее в любое удобное время (день), еще 1 час обучения для ответов на накопившиеся у вас вопросы.
Три самых частых вопроса
- 1. «Мне же не хватит 4 часа!»
Ответ: поверьте, хватит. смотрите видео пример обучения в 1С.
2. «Обучение дистанционное? как-то мутно. »
Ответ: если я буду стоять рядом, запоминать вы от этого лучше не станете.
Ответ: во время обучения я отвечаю на все ваши вопросы. Курсы, это курсы, а ответы на вопросы во время работы – это сопровождение 1С (оно у меня тоже есть).
План обучения 1С:Предприятие
- 1. Как купить товар
- 2. Как назначить ему цены
- 3. Как распечатать ценники и прайс-лист
- 4. Как оформить продажу
- 5. Как посмотреть отчеты по закупкампродажамостаткам
- 6. Как провести инвентаризацию
- 7. Ответы на ВСЕ ваши вопросы!
Обучение проводится дистанционно, надо только договорится о времени обучения.
Результат обучения
- 1. Вы уверенно работаете в 1С
- 2. Вы знаете что умеет и чего не умеет 1С (это нужно чтобы вам не «вешали лапшу» при доработки 1С )
- 3. Вы получаете видео запись обучения
100% гарантия возврата средств
Оплатив курс, если вам не подойдет формат обучения, сообщите об этом в течении первого часа обучения, и без лишних вопросов верну ваши деньги.
Имеем три машины:
М1 – машина с расшаренным ресурсом
М2 – машина с сервером 1С
М3 – машина с клиентом 1С
В 1С в настройках работы с файлами указываю Хранить файлы в томах на диске. Том хочу создать в ресурсе на М1.
Вопрос первый – какой пользователь должен иметь доступ в этот ресурс? Тот, от которого на М2 сервер запущен? Или тот, который на М3 клиента запускает? Или как?
Теперь немного меняем ситуацию. На М3 к базе 1С подключаемся через внешнее соединение и пытаемся присоединять файлы.
Вопрос второй – а в этом случае какому пользователю нужен доступ в общий ресурс?
Поскольку файлы присоединить у меня не получилось, то есть ощущение, что ответы на первый и второй вопрос разные.
К сожалению, вся эта система от меня далеко, управляется не мной, т.е. нет возможности по-быстрому перепробовать все комбинации. Да и вообще, был бы рад получить теоретическое обоснование.
Заранее спасибо!
p.s. Спасибо ответившим. Я до сих пор и не сомневался, что права на ресурс нужны серверу, ну, пользователю под которым он запущен. Но вот какая проблема.
Конфигурация описана выше. Если я работаю в обычном клиенте 1С на М3 я могу добавлять файлы без проблем, т.е. том настроен правильно, он доступен, ограничений по размерам нет.
И есть у меня код, который нужно выполнять, подключаясь к этой же базе через внешнее соединение. Код присоединяет файлы к документам.
Если файлы хранить в базе, то всё работает отлично – файлы добавляются. Но если я включаю хранение файлов на диске, то при попытке присоединить файл получаю ошибку:
<ОбщийМодуль.ПрисоединенныеФайлы.Модуль(605)>: Ошибка при добавлении присоединенного файла «1234567890.pdf»:
Не удалось добавить файл ни в один из томов.
Список ошибок:
Ошибка при добавлении файла «1234567890.pdf»
в том «Том1» (\М1Тома 1С20170922):
«Ошибка при создании каталога «\М1Тома 1С20170922»:
«Неправильный путь к файлу ‘\М1’. 161(0x000000A1): Указан недопустимый путь. «.».
- Вопрос задан более двух лет назад
- 1899 просмотров
Вопрос первый – какой пользователь должен иметь доступ в этот ресурс?
Пользователь под которым работает сервер 1с.
Вопрос второй – а в этом случае какому пользователю нужен доступ в общий ресурс?
Тому же самому – пользователю под которым запущен сервер 1с.
Файлы хранит 1с, и работает с ними 1с.
Все пользователи работают только с сервером, и не могут работать с файлами, если им нужен доступ к файлу они просят сервер, и сервер выдает им нужный файл. Поэтому пользователям 1с права на файлы не нужны вообще.
Используя File API, добавленный к DOM в HTML5, в веб-приложениях теперь можно запрашивать пользователя выбрать локальные файлы и затем читать содержимое этих файлов. Выбор файлов может осуществляться с помощью элемента <input> или drag and drop.
Если вы хотите использовать DOM File API в расширениях или коде Chrome, используйте. На самом деле, в таком случае вам необходимо ознакомиться с дополнительными нюансами. См. статью Using the DOM File API in chrome code для подробностей.
Доступ к выбранным файлам
Рассмотрим следующий код:
<input type=»file» id=»input» multiple>
File API делает возможным доступ к FileList, который содержит объекты File, которым соответствуют файлы, выбранные пользователем.
Атрибут multiple элемента input позволяет пользователю выбрать несколько файлов.
Обращение к одному выбранному файлу с использованием классической DOM-модели:
const selectedFile = document.getElementById(‘input’).files;
Обращение к одному выбранному файлу через jQuery:
var selectedFile = $(‘#input’).get(0).files; var selectedFile = $(‘#input’).files;
Если вы получили ошибку «files is undefined», значит вы выбрали не один HTML-элемент, а список элементов, который возвращает jQuery. Нужно уточнить, у какого именно элемента необходимо вызвать метод «files»
Доступ к выбранным файлам через событие change
Также возможно (но не обязательно) получить доступ к FileList через событие change. Нужно использовать EventTarget.addEventListener() чтобы добавить обработчик события change, как показано здесь:
const inputElement = document.getElementById(«input»); inputElement.addEventListener(«change», handleFiles, false); function handleFiles() { const fileList = this.files; /* now you can work with the file list */ }
Обработчик события change можно назначить атрибутом элемента:
<input type=»file» id=»input» onchange=»handleFiles(this.files)»>
Когда пользователь выбирает файл, функция handleFiles() будет вызвана с объектом FileList, который состоит из объектов File, представляющих файлы, выбранные пользователем.
Получение информации о выделенных файлах
Объект FileList предоставляемый классическим DOM содержит все файлы выбранные пользователем, каждый из которых представляет собой объект File. Вы можете определить сколько файлов выбрал пользователь проверяя значение аттрибута длины (length) списка файлов:
var numFiles = files.length;
Конкретные объекты File могут быть получены обращением к списку файлов как к массиву:
for (var i = 0, numFiles = files.length; i < numFiles; i++) { var file = files; .. }
Этот цикл проходит по всем файлам в списке файлов.
Всего существует три аттрибута, предоставляемых объектом File, которые содержат полезную информацию о файле.
name Имя файла как строка доступная только для чтения. Это просто имя файла и оно не включает в себя информацию о пути. size Размер файла в байтах, как 64-битное целое число (возможно только чтение). type MIME тип файла, как строка доступная только для чтения, или пустая строка («») если тип файла не может быть определён.
Пример: Отображение размера файла(ов)
Следующий пример показывает возможное использование свойства size:
<!DOCTYPE html> <html> <head> <meta charset=»UTF-8″> <title>File(s) size</title> <script> function updateSize() { var nBytes = 0, oFiles = document.getElementById(«uploadInput»).files, nFiles = oFiles.length; for (var nFileId = 0; nFileId < nFiles; nFileId++) { nBytes += oFiles.size; } var sOutput = nBytes + » bytes»; // optional code for multiples approximation for (var aMultiples = , nMultiple = 0, nApprox = nBytes / 1024; nApprox > 1; nApprox /= 1024, nMultiple++) { sOutput = nApprox.toFixed(3) + » » + aMultiples + » (» + nBytes + » bytes)»; } // end of optional code document.getElementById(«fileNum»).innerHTML = nFiles; document.getElementById(«fileSize»).innerHTML = sOutput; } </script> </head> <body onload=»updateSize();»> <form name=»uploadForm»> <p><input id=»uploadInput» type=»file» name=»myFiles» onchange=»updateSize();» multiple> selected files: <span id=»fileNum»>0</span>; total size: <span id=»fileSize»>0</span></p> <p><input type=»submit» value=»Send file»></p> </form> </body> </html>
Использование метода click() скрытых элементов выбора файла
Начиная с Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1), вы можете скрыть непривлекательный элемент <input> и предоставить свой собственный интерфейс для открытия диалогового окна выбора и отображения файла или файлов, выбранных пользователем. Вы можете сделать это, присвоив свойству display элемента input значение none (display:none) и вызывая метод скрытого элемента <input>.
Рассмотрим следующую разметку HTML:
<input type=»file» id=»fileElem» multiple accept=»image/*» style=»display:none» onchange=»handleFiles(this.files)»> <a href=»#» id=»fileSelect»>Select some files</a>
Код, обрабатывающий событие click, может выглядеть следующим образом:
var fileSelect = document.getElementById(«fileSelect»), fileElem = document.getElementById(«fileElem»); fileSelect.addEventListener(«click», function (e) { if (fileElem) { fileElem.click(); } e.preventDefault(); // предотвращает перемещение к «#» }, false);
Таким образом, вы можете стилизовать новую кнопку открытия диалога выбора файла так, как пожелаете.
Использование элемента label скрытого элемента input
Для того, чтобы открыть диалог выбора файла без использования JavaScript (метода click()), можно воспользоваться элементом <label>.
Рассмотрим следующую разметку HTML:
<input type=»file» id=»fileElem» multiple accept=»image/*» style=»display:none» onchange=»handleFiles(this.files)»> <label for=»fileElem»>Select some files</label>
В данном случае нет необходимости добавлять код JavaScript для того, чтобы вызвать fileElem.click(). Также в данном случае вы можете стилизовать элемент label так, как пожелаете.
Выбор файлов с использованием технологии drag and drop
Также вы можете предоставить пользователю возможность непосредственно перетаскивать файлы в ваше веб-приложение.
На первом шаге необходимо определить зону, в которую будут перетаскиваться файлы. В каждом конкретном случае часть содержимого вашей страницы, ответственная за приемку перетаскиваемых файлов, может варьироваться в зависимости от дизайна приложения, тем не менее, заставить элемент воспринимать события перетаскивания достаточно просто:
var dropbox; dropbox = document.getElementById(«dropbox»); dropbox.addEventListener(«dragenter», dragenter, false); dropbox.addEventListener(«dragover», dragover, false); dropbox.addEventListener(«drop», drop, false);
В данном примере мы превращаем элемент с ID, равным dropbox, в нашу зону перетаскивания при помощи добавления обработчиков для событий dragenter, dragover и drop.
В нашем случае нет необходимости делать что-то особенное при обработке событий dragenter и dragover, таким образом, обе функции, ответственные за обработку данных событий, довольно просты. Они останавливают распространение события и предотвращают возникновение действия по умолчанию:
function dragenter(e) { e.stopPropagation(); e.preventDefault(); } function dragover(e) { e.stopPropagation(); e.preventDefault(); }
Вся настоящая магия происходит в функции drop():
function drop(e) { e.stopPropagation(); e.preventDefault(); var dt = e.dataTransfer; var files = dt.files; handleFiles(files); }
Здесь мы извлекаем из события поле dataTransfer, затем вытаскиваем из него список файлов и передаем этот список в handleFiles(). После этого процесс обработки файлов одинаков вне зависимости от того, использовал ли пользователь для их выбора элемент input или технологию drag and drop.
Пример: Отображение эскизов изображений, выбранных пользователем
Представим, что вы разрабатываете очередной веб-сайт для обмена фотографиями и вы хотите использовать возможности HTML5 для предварительного просмотра изображений перед тем, как пользователь загрузит их. Вы можете создать input eэлемент или зону перетаскивания, как обсуждалось ранее, и вызвать такую функцию, как handleFiles() ниже.
function handleFiles(files) { for (var i = 0; i < files.length; i++) { var file = files; if (!file.type.startsWith(‘image/’)){ continue } var img = document.createElement(«img»); img.classList.add(«obj»); img.file = file; preview.appendChild(img); // Предполагается, что «preview» это div, в котором будет отображаться содержимое. var reader = new FileReader(); reader.onload = (function(aImg) { return function(e) { aImg.src = e.target.result; }; })(img); reader.readAsDataURL(file); } }
Здесь наш цикл обрабатывает выбранные пользователем файлы, проверяя атрибут type у каждого файла, чтобы определить является ли файл изображением (выполняется регулярное выражение в строке «image.*»). Для каждого файла, который является изображением, мы создаем новый img элемент. Можно использовать CSS для установки красивых рамок, теней, и указания размеров изображения, но здесь нет нужды делать этого.
Каждое изображение имеет CSS класс obj добавленный к нему для упрощения его поиска в DOM дереве. Мы также добавили атрибут file к каждому изображению, указав File ; это позволит на получить изображения для фактической загрузки позже. Наконец, мы используем Node.appendChild() для того, чтобы добавить новый эскиз в область предпросмотра нашего документа.
Затем мы устанавливаем FileReader для обработки асинхронной загрузки изображения и прикрепления его к img элементу. После создания нового объекта FileReader, мы настраиваем его функцию onload, затем вызываем readAsDataURL() для запуска операции чтения в фоновом режиме. Когда всё содержимое файла изображения загружено, они преобразуют его в data: URL, который передается в обратный вызов onload . Наша реализация этой процедуры просто устанавливает атрибут src у элемента img загруженного изображения, в результате чего миниатюра изображения появляется на экране пользователя.
Использование URLs объктов
Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1) представляет поддержку для методов DOM window.URL.createObjectURL() и window.URL.revokeObjectURL(). Они позволяют создавать простые строки URL, которые могут быть использованы для обращения к любым данным, на которые можно ссылаться, используя объект DOM File, включая локальные файлы на компьютере пользователя.
Когда у вас есть объект File, на который вы хотите ссылаться по URL из HTML, вы можете создать для этого объект URL, такой как этот:
var objectURL = window.URL.createObjectURL(fileObj);
URL объекта – это строка, идентифицирующая объект файла File. Каждый раз при вызове window.URL.createObjectURL(), создается новый уникальный объект URL, даже если вы уже создали объект URL для этого файла. Каждый из них должен быть освобожден. В то время как они освобождаются автоматически когда документ выгружается, если ваша страница использует их динамически, вы должны освободить их явно вызовом window.URL.revokeObjectURL():
window.URL.revokeObjectURL(objectURL);
Пример: Использование URL объектов для отображения изображений
Этот пример использует URL объектов для отображения эскизов изображений. Кроме этого, оно показывает другую информацию о файлах, включая их имена и размеры. Вы можете посмотреть работающий пример.
HTML, который представляет интерфейс, выглядит так:
<input type=»file» id=»fileElem» multiple accept=»image/*» style=»display:none» onchange=»handleFiles(this.files)»> <a href=»#» id=»fileSelect»>Select some files</a> <div id=»fileList»> <p>No files selected!</p> </div>
Здесь определяется элемент файла <input>, а также ссылка, которая вызывает окно выбора файла, т.к. мы сделали элемент ввода файла скрытым, чтобы этот не слишком привлекательный элемент интерфейса не отображался. Об этом рассказывается в разделе , как о методе вызова окна выбора файла.
Метод handleFiles() может быть реализован таким образом:
window.URL = window.URL || window.webkitURL; var fileSelect = document.getElementById(«fileSelect»), fileElem = document.getElementById(«fileElem»), fileList = document.getElementById(«fileList»); fileSelect.addEventListener(«click», function (e) { if (fileElem) { fileElem.click(); } e.preventDefault(); // prevent navigation to «#» }, false); function handleFiles(files) { if (!files.length) { fileList.innerHTML = «<p>No files selected!</p>»; } else { var list = document.createElement(«ul»); for (var i = 0; i < files.length; i++) { var li = document.createElement(«li»); list.appendChild(li); var img = document.createElement(«img»); img.src = window.URL.createObjectURL(files); img.height = 60; img.onload = function() { window.URL.revokeObjectURL(this.src); } li.appendChild(img); var info = document.createElement(«span»); info.innerHTML = files.name + «: » + files.size + » bytes»; li.appendChild(info); } } }
Он начинается с получения элемента <div> с ID fileList. Это блок, в который мы вставим наш список файлов, включая эскизы..
Если объект FileList, передаваемый в handleFiles() является null, то мы просто устанавливаем внутренний HTML блока в отображение текста «No files selected!». Иначе мы начинаем строить список файлов таким образом:
- Создается новый элемент — неупорядоченный список (<ul>).
- Этот новый элемент вставляется в блок <div> с помощью вызова его метода element.appendChild().
- Для каждого File в FileList, представляемого files:
- Создаем новый элемент пункта списка (<li>) и вставляем его в список.
- Создаем новый элемент изображения (<img>).
- Устанавливаем источник изображения в новый URL объекта, представляющий файл, используя window.URL.createObjectURL() для создания URL на двоичный объект.
- Устанавливаем высоту изображения в 60 пикселей.
- Устанавливаем обработчик события загрузки изображения для освобождения URL объекта, т.к. после загрузки изображения он больше не нужен. Это делается вызовом метода window.URL.revokeObjectURL(), передавая в него строку URL объекта, которая указана в img.src.
- Добавляем новый элемент в список.
Пример: Загрузка файла, выбранного пользователем
Еще одна вещь, которую вы можете захотеть сделать – это позволить пользователю загрузить выбранный файл или файлы (такие, как изображения из предыдущего примера) на сервер. Это можно сделать асинхронно довольно просто.
Создание заданий на загрузку
Продолжая пример с кодом, который строил эскизы в предыдущем примере, напомним, что каждому изображению эскиза присвоен класс CSS class obj, с соответствующим File, прикрепленным в атрибут file. Это позволяет нам очень просто выбрать все изображения, которые пользователь выбрал для загрузки используя Document.querySelectorAll(), как показано здесь:
function sendFiles() { var imgs = document.querySelectorAll(«.obj»); for (var i = 0; i < imgs.length; i++) { new FileUpload(imgs, imgs.file); } }
Строка 2 получает NodeList в переменную imgs со всеми элементами документа, имеющих класс CSS obj. В нашем случае все они будут эскизами изображений. Как только мы получим этот список, можно просто пройти по нему, создавая для каждого элемента новый экземпляр FileUpload. Каждый из них отвечает за загрузку соответствующего файла.
Управление процессом загрузки файла
Функция FileUpload принимает на вход 2 параметра: элемент изображения и файл, из которого нужно читать данные изображения.
function FileUpload(img, file) { const reader = new FileReader(); this.ctrl = createThrobber(img); const xhr = new XMLHttpRequest(); this.xhr = xhr; const self = this; this.xhr.upload.addEventListener(«progress», function(e) { if (e.lengthComputable) { const percentage = Math.round((e.loaded * 100) / e.total); self.ctrl.update(percentage); } }, false); xhr.upload.addEventListener(«load», function(e){ self.ctrl.update(100); const canvas = self.ctrl.ctx.canvas; canvas.parentNode.removeChild(canvas); }, false); xhr.open(«POST», «http://demos.hacks.mozilla.org/paul/demos/resources/webservices/devnull.php»); xhr.overrideMimeType(‘text/plain; charset=x-user-defined-binary’); reader.onload = function(evt) { xhr.send(evt.target.result); }; reader.readAsBinaryString(file); }
Функция FileUpload(), показанная выше, создает объект Throbber, который используется для отображения хода загрузки, а затем создает XMLHttpRequest для управления загрузкой данных.
Перед началом загрузки данных выполняются несколько шагов для подготовки:
- На XMLHttpRequest устанавливается обработчик события progress для обновления индикатора хода загрузки новыми значениями процента выполнения, так что по мере хода загрузки, индикатор будет обновляться, отображая последнюю информацию.
- На XMLHttpRequest’s устанавливается обработчик события load для установки индикатора загрузки в значение 100%, чтобы убедиться, что индикатор действительно установлен в 100% (в случае проблем детализации в ходе процесса). Затем обработчик удаляет индикатор загрузки, т.к. он более не нужен. Поэтому индикатор исчезает как только загрузка завершена.
- Запрос на загрузку файла изображения открывается вызовом метода XMLHttpRequest’s open() для начала создания POST-запроса.
- Тип MIME для загрузки устанавливается вызовом функции XMLHttpRequest overrideMimeType(). В этом случае мы используем общий тип MIME type; вам может быть нужно или не нужно вообще устанавливать тип MIME в зависимости от вашего случая.
- Объект FileReader используется для преобразования файла в двоичную строку.
- И в завершение, когда содержимое загружено, вызывается функция XMLHttpRequest send() для отправки содержимого файла.
Асинхронная обработка процесса загрузки
<?php if (isset($_FILES)) { // Example: move_uploaded_file($_FILES, «uploads/» . $_FILES); exit; } ?><!DOCTYPE html> <html> <head> <title>dnd binary upload</title> <meta http-equiv=»Content-Type» content=»text/html; charset=UTF-8″> <script type=»text/javascript»> function sendFile(file) { var uri = «/index.php»; var xhr = new XMLHttpRequest(); var fd = new FormData(); xhr.open(«POST», uri, true); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { // Handle response. alert(xhr.responseText); // handle response. } }; fd.append(‘myFile’, file); // Initiate a multipart/form-data upload xhr.send(fd); } window.onload = function() { var dropzone = document.getElementById(«dropzone»); dropzone.ondragover = dropzone.ondragenter = function(event) { event.stopPropagation(); event.preventDefault(); } dropzone.ondrop = function(event) { event.stopPropagation(); event.preventDefault(); var filesArray = event.dataTransfer.files; for (var i=0; i<filesArray.length; i++) { sendFile(filesArray); } } } </script> </head> <body> <div> <div id=»dropzone» style=»margin:30px; width:500px; height:300px; border:1px dotted grey;»>Drag & drop your file here…</div> </div> </body> </html>
Пример: Использование URL объектов для отображения PDF
URL объектов могут быть использованы не только для изображений! Также этот прием можно использовать и для других ресурсов, которые могут отображаться браузером, например, файлы PDF.
В Firefox, для того чтобы файл PDF появился в iframe и не предлагался для загрузки, нужно установить pdfjs.disabled в значение false .
<iframe id=»viewer»>
А здесь изменение атрибута src:
var obj_url = window.URL.createObjectURL(blob); var iframe = document.getElementById(‘viewer’); iframe.setAttribute(‘src’, obj_url); window.URL.revokeObjectURL(obj_url);
Пример: Использование URL объектов с другими типами файлов
Вы можете таким же образом работать с файлами в других форматах. Ниже приведен пример как загружается видео:
////////////////////////////////////////////////////////////////////////////////
// ОТБОР
//Процедура устанавливает значения параметров в запросе.
// Имя — Имя параметра
// Значение — Значение для отбора
Процедура УстановитьПараметрКомпоновки (Имя,Значение)
КомпоновкаДанныхПараметр =
КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(Имя);
Если НЕ(КомпоновкаДанныхПараметр = Неопределено) Тогда
КомпоновкаДанныхПараметр.Значение = Значение;
КомпоновкаДанныхПараметр.Использование = Истина;
Иначе Сообщить(«Параметр «+Имя+» не найден»);
КонецЕсли;
КонецПроцедуры
//Процедура устанавливает отбор по полям запроса.
// Имя — Имя поля
// Значение — Значение для отбора
// ВидСравнения — ВидСравненияКомпоновкиДанных
Процедура УстановтьОтборПоПолюКомпоновки(Имя,Значение,ВидСравнения)
Для Каждого ЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Имя) И ЭлементОтбора.ВидСравнения = ВидСравнения Тогда
КомпоновщикНастроек.Настройки.Отбор.Элементы.Удалить(ЭлементОтбора);
КонецЕсли;
КонецЦикла;
ЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Имя);
ЭлементОтбора.ВидСравнения = ВидСравнения;
ЭлементОтбора.ПравоеЗначение = Значение;
ЭлементОтбора.Использование = Истина;
КонецПроцедуры
ниже приведенный материал взят отсюда http://infostart.ru/public/19793/
////////////////////////////////////////////////////////////////////////////////
// НАБОРЫ ДАННЫХ
// Процедура добавляет или удаляет набор данных из схемы компоновки данных
//
// Схема — СхемаКомпоновкиДанных, схема, в которой нужно добавить(удалить) набор данных
// СхемаИсточник — СхемаКомпоновкиДанных, схема из которой копируется набор данных
// ИмяНабора — Строка
// Добавить — Булево
// НаборДанныхРодитель — НаборДанныхОбъединениеСхемыКомпоновкиДанных
Процедура ДобавитьУдалитьНаборДанных(Схема, СхемаИсточник, ИмяНабора, Добавить, НаборДанныхРодитель)
НаборДанных = НайтиНаборДанных(Схема.НаборыДанных, ИмяНабора);
Если Добавить Тогда
Если НаборДанных = Неопределено Тогда
НаборДанныхИсточник = НайтиНаборДанных(СхемаИсточник.НаборыДанных, ИмяНабора);
НаборДанных = НаборДанныхРодитель.Элементы.Добавить(Тип(«НаборДанныхЗапросСхемыКомпоновкиДанных»));
НаборДанных.Имя = НаборДанныхИсточник.Имя;
НаборДанных.ИсточникДанных = НаборДанныхИсточник.ИсточникДанных;
НаборДанных.Запрос = НаборДанныхИсточник.Запрос;
КонецЕсли;
Иначе
Если НаборДанных <> Неопределено Тогда
НаборДанныхРодитель.Элементы.Удалить(НаборДанных);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция НайтиНаборДанных(НаборыДанных, Имя)
Если НаборыДанных = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Для каждого НаборДанных Из НаборыДанных Цикл
Если НаборДанных.Имя = Имя Тогда
Возврат НаборДанных;
КонецЕсли;
Если ТипЗнч(НаборДанных) = Тип(«НаборДанныхОбъединениеСхемыКомпоновкиДанных») Тогда
Результат = НайтиНаборДанных(НаборДанных.Элементы, Имя);
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// ГРУППИРОВКИ
// Функция находит группировку в компоновке
// Структура — КомпоновщикНастроек.Настройки.Структура
// Имя — Имя поля в группировке
// Возвращаемое значение: ПолеКомпоновкиДанных
Функция НайтиГруппировку(Структура, Имя, ВидГруппировки = «Поле»)
Для Каждого Элемент Из Структура Цикл
Если ТипЗнч(Элемент) = Тип(«ТаблицаКомпоновкиДанных») Тогда
Результат = НайтиГруппировку(Элемент.Строки, Имя);
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
Результат = НайтиГруппировку(Элемент.Колонки, Имя);
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
ИначеЕсли ТипЗнч(Элемент) = Тип(«ГруппировкаТаблицыКомпоновкиДанных») Тогда
Для Каждого Поле Из Элемент.ПоляГруппировки.Элементы Цикл
Если Поле.Поле = Новый ПолеКомпоновкиДанных(Имя) Тогда
Если ВидГруппировки = «Поле» Тогда
Результат = Поле;
Иначе
Результат = Элемент;
КонецЕсли;
Возврат Результат;
КонецЕсли;
КонецЦикла;
Результат = НайтиГруппировку(Элемент.Структура, Имя);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// Процедура добавляет в каждую группировку отчета отбор по непустому значению
// Структура — КомпоновщикНастроек.Настройки.Структура
// ДоступныеПоляГруппировок — КомпоновщикНастроек.ДоступныеПоляГруппировок
Процедура ОтборПоНепустым(Структура)
Для Каждого Элемент Из Структура Цикл
Если ТипЗнч(Элемент) = Тип(«ТаблицаКомпоновкиДанных») Тогда
ОтборПоНепустым(Элемент.Строки);
ОтборПоНепустым(Элемент.Колонки);
ИначеЕсли ТипЗнч(Элемент) = Тип(«ГруппировкаТаблицыКомпоновкиДанных») Тогда
Для Каждого Поле Из Элемент.ПоляГруппировки.Элементы Цикл
ЭлементОтбора = Неопределено;
Для Каждого ЭлементОтбора1 Из Элемент.Отбор.Элементы Цикл
Если ЭлементОтбора1.Представление = «Отбор по непустому» Тогда
ЭлементОтбора = ЭлементОтбора1;
КонецЕсли;
КонецЦикла;
Если ЭлементОтбора = Неопределено Тогда
ЭлементОтбора = Элемент.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
ЭлементОтбора.Представление = «Отбор по непустому»;
КонецЕсли;
ЭлементОтбора.ЛевоеЗначение = Поле.Поле;
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
ЭлементОтбора.Использование = Истина;
Параметр = Элемент.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(«FilterOutput»));
Параметр.Использование = Истина;
Параметр.Значение = ТипВыводаТекстаКомпоновкиДанных.НеВыводить;
КонецЦикла;
ОтборПоНепустым(Элемент.Структура);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// ПОЛЬЗОВАТЕЛЬСКИЕ ПОЛЯ
// Процедура добавляет значения интервалов в пользовательское поле
// ПолеИнтервалы — ПользовательскоеПолеВыборКомпоновкиДанных
// Интервал — Строка содержащия границы интервалов: 30,60,90
Процедура УстановитьПользовательскоеПолеИнтервал(ПолеИнтервалы, Интервал)
Если ПустаяСтрока(Интервал) Тогда
Возврат;
КонецЕсли;
Стр = Интервал;
Стр = СтрЗаменить(Стр, «,», Символы.ПС);
ПредИнтервал = «0»;
Группа = Вариант.Отбор.Элементы.Добавить(Тип(«ГруппаЭлементовОтбораКомпоновкиДанных»));
Группа.Использование = Истина;
Группа.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
Если Счетчик > 1 Тогда
ЭлементОтбора = Группа.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«ДнейПросрочки»);
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
ЭлементОтбора.ПравоеЗначение = Число(ПредИнтервал);
КонецЕсли;
ЭлементОтбора = Группа.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«ДнейПросрочки»);
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
ЭлементОтбора.ПравоеЗначение = Число(ТекИнтервал);
ПредИнтервал = ТекИнтервал;
Группа = Вариант.Отбор.Элементы.Добавить(Тип(«ГруппаЭлементовОтбораКомпоновкиДанных»));
Группа.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
ЭлементОтбора = Группа.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«ДнейПросрочки»);
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
ЭлементОтбора.ПравоеЗначение = Число(ПредИнтервал);
КонецПроцедуры