Загрузить изображение с помощью кнопки входного файла или перетащить файл

сейчас учусь загружать файл с HTML5 и JavaScript (JQuery). и у меня с этим проблема. Итак, ниже представлен предварительный просмотр моего приложения.

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

вот код:

  

Отбросить Ваше изображение здесь

Php echo form_open_multipart ('umum/uploadFile', ['id' => 'form_upload']);?>

Сюда можно загружать только файл изображения.

Php echo form_close (); ?>

и затем мой скрипт:

  //предварительный просмотр файла  что будет загружена функция readURL (input) {if (input.files && input.files [0]) {var reader = new FileReader ();  reader.onload = function (event) {$ ('# blah'). html ('');  } reader.readAsDataURL (input.files [0]);  }}//вручную выбрать файл из входного файла button $ ("# userfile"). change (function () {readURL (this);}); //перетаскиваем изображение файла $ (function () {$ ('# blah'). bind ('dragover', function () {$ (this) .addClass ('dropzone-active');}); $ (  '#blah'). bind ('dragleave', function () {$ (this) .removeClass ('dropzone-active');});});  функция drag_drop (событие) {event.preventDefault (); //анализ данных для предварительного просмотра файла перед загрузкой readURL (event.dataTransfer); //предупреждение (event.dataTransfer.files [0]); //предупреждение (event.dataTransfer.files [0] .name); //предупреждение (event.dataTransfer.files [0] .size + «байты»);  }  

и проблема в том, что я не могу изменить значение кнопки входного файла, когда перетаскиваю изображение в зону перетаскивания. и, конечно же, я не могу загрузить файл, потому что входной файл остается пустым. Кстати, я попытался написать $ ('# userfile'). Val (event.dataTransfer.files [0]); в функции drag_drop наверху, и результат в моей консоли:

Неперехваченное исключение DOMException: не удалось установить свойство ‘value’ в ‘HTMLInputElement’: этот элемент ввода принимает имя файла, которое может быть только программно установлено на пустую строку.


NB : обратите внимание, что кросс-браузерный способ загрузки перетаскиваемых файлов без Ajax невозможен.. Также обратите внимание (и это может быть причиной ограничения) последствия для безопасности попытки присвоить значение полю ввода загрузки файла: если бы можно было программно назначать значения таким образом, представьте себе что-то вроде:

  $ ("input [type = file]"). val ("passwords.txt");  

Итак, у нас есть использовать AJAX. При этом вам просто нужно создать новый экземпляр FormData и добавить к нему свойство dataTransfer.files из вашего события перетаскивания:

  функция drag_drop (event) {event.preventDefault ();  $ .each (dataTransfer.files, function (i, file) {uploadData.append ("userfile", file);});  } var $ form = document.querySelector ('form'), ajaxData = new FormData ($ form);  $ .ajax ({url: $ form.attr ('действие'), тип: $ form.attr ('метод'), data: ajaxData, dataType: 'json', cache: false, contentType: false, processData: false //Важно для загрузки файлов});  

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

Вы также можете установить атрибут multiple в поле ввода файла, заданный из вашего кода, я вижу, вы обрабатываете несколько файлов.

Полное руководство



/zeroupload

Резюме: HTML5 перетащите и выберите библиотеку для загрузки нескольких файлов с возможностью перетаскивания и выбора с «нулевым интерфейсом».

ZeroUpload — это небольшой (~ 2,2K gzip и минимизированный) Библиотека HTML5/JavaScript для загрузки файлов. У него есть простой API для интеграции с вашим веб-приложением, обеспечивающий как функцию перетаскивания, так и функцию выбора при нажатии. Вы также можете ограничить типы файлов, общий размер и количество разрешенных файлов. Библиотека обрабатывает все детали за кулисами, отправляя в ваш код события прогресса и завершения, но у нее вообще нет пользовательского интерфейса. Пользовательский интерфейс вашего приложения является вашим — мы просто предоставляем крючки.

Открытый исходный код

ZeroUpload — это открытый исходный код , Лицензирован MIT и доступен на GitHub:

https://github.com/jhuckaby/zeroupload

Краткое руководство

Возьмите файл zeroupload.js и разместите его на своем сервере. Вот минимальный пример реализации:

     
Перетащите сюда файлы! Или нажмите, чтобы выбрать!
$ (документ) .ready (function () {ZeroUpload.setURL ('upload.php'); ZeroUpload.on ('complete', function (response) {$ ('# results'). html ('

Загрузка завершена!
' + ответ. данные + '

'); }); ZeroUpload.init (); ZeroUpload.addDropTarget ('#mydrop'); });

Библиотека работает, присоединяясь к DIV, чтобы обеспечить «зону перетаскивания» для загрузки методом перетаскивания, но вы также можете явно вызвать ZeroUpload.chooseFiles () , чтобы открыть стандартный диалог выбора файла ОС. Затем вы можете зарегистрировать прослушиватели событий для таких вещей, как ход загрузки, завершение загрузки и т. Д.

В коде на стороне сервера файлы будут поступать как стандартные загрузки файлов HTTP POST с именами файл1 , файл2 , ... файлN . Например, вот как сохранить загруженные файлы на ваш сервер с помощью PHP:

 foreach ($ _FILES as $ key => & $ file) {if (! Move_uploaded_file (  $ file ['tmp_name'], basename ($ file ['name']))) {die ("Не удалось сохранить загруженный файл". $ file ['name']. "'. Пожалуйста, проверьте разрешения.");  }} 

Предварительные требования

ZeroUpload полагается на jQuery. Вы можете получить его бесплатно на jQuery.com. Любая современная версия должна работать нормально, v1.6 или новее.

Если вы уже используете другую библиотеку, которая конфликтует с jQuery (т. Е. Ту, которая резервирует глобальный $ переменная), вы можете вызвать jQuery.noConflict () , и ZeroUpload по-прежнему будет работать нормально.

Установка URL-адреса

Первое, что вам нужно сделать, это установить целевой URL для ваших загрузок. Обратите внимание, что вы можете настроить это для каждой зоны перетаскивания или для каждого щелчка, как описано ниже. Но если все ваши загрузки будут идти по одному общему URL-адресу, вы можете установить его один раз, вызвав ZeroUpload.setURL () . Пример:

 ZeroUpload.setURL ("/path/to/myscript.php"); 

Если вы загружаете на URL-адрес в домене, отличном от текущей страницы, убедитесь, что ваш серверный сценарий отправляет правильный HTTP-заголовок Access-Control-Allow-Origin.

Установка Максимальный предел файла

По умолчанию ZeroUpload позволяет загружать любое количество файлов одновременно. Чтобы установить ограничение, вызовите функцию ZeroUpload.setMaxFiles () и передайте целое число. Пример:

 ZeroUpload.setMaxFiles (1); 

Если установлен предел, и пользователь удаляет слишком много файлов, генерируется ошибка (см. Событие ошибки ниже). Если вызывается chooseFiles () (см. Раздел «Выбор файлов вручную» ниже), выбор ограничивается в самом диалоговом окне выбора файла ОС.

Установка максимального размера загрузки

По умолчанию ZeroUpload позволяет загружать файлы любого размера. Чтобы установить ограничение на размер, вызовите функцию ZeroUpload.setMaxBytes () и передайте целое число, представляющее максимальное количество байтов, которое можно разрешить. Обратите внимание, что это измеряется для всех файлов вместе, а не для каждого файла. Пример:

 ZeroUpload. setMaxBytes (8 * 1024 * 1024); //8 МБ 

Примечание. Не полагайтесь на ограничение максимального размера файла на стороне клиента для защиты вашего сервера от атак. Такие ограничения можно легко изменить с помощью букмарклетов JavaScript и т. Д. Убедитесь, что вы всегда устанавливаете ограничения на размер загружаемых файлов в коде на стороне сервера.

Настройка разрешенных файлов Типы

По умолчанию ZeroClipboard позволяет выбирать любые типы файлов для загрузки. Чтобы ограничить, какие типы файлов вы хотите принимать или какие категории (например, только изображения), вызовите функцию ZeroUpload.setFileTypes () и передайте один или несколько описателей типа MIME. Подстановочные знаки тоже принимаются. Пример:

 ZeroUpload.setFileTypes ("image/*", "audio/mpeg"); 

Это позволит все форматы изображений и аудиофайлы MPEG/MP3 для загрузки. Если пользователь удаляет файл, который не соответствует вашим принятым типам, генерируется ошибка (см. Событие ошибки ниже). Если вызывается chooseFiles () (см. Раздел «Выбор файлов вручную» ниже), выбор ограничивается желаемыми типами в самом диалоговом окне выбора файла ОС.

Инициализация

После настройки ваших параметров (см. выше) вы должны инициализировать библиотеку ZeroUpload, вызвав ZeroUpload.init () . Это нужно сделать после того, как DOM будет готов. Пример:

 ZeroUpload.init (); 

Указание целей перетаскивания

Чтобы использовать ZeroUpload для загрузки файлов в стиле перетаскивания, вы должны объявить одну или несколько целей перетаскивания. Это области вашей страницы, которые принимают удаление пользовательских файлов. Вы можете активировать отбрасывание на любом блочном элементе, таком как DIV, или на всем элементе вашего тела. В любом случае вызывается функция ZeroUpload.addDropTarget () . Передайте любой селектор CSS или элемент DOM (все, что может решить jQuery). Пример:

 ZeroUpload.addDropTarget ("#mydroparea"); 

Это активирует удаление файлов на элементе DOM с идентификатором #mydroparea . Чтобы включить эффект CSS, когда пользователь наводит курсор на элемент с файлами в руке, см. Раздел «Стилизация перетаскивания при наведении курсора» ниже.

Каждая цель перетаскивания может иметь настраиваемый целевой URL-адрес, параметры запроса и /или элемент «пользовательские данные» для передачи произвольных данных в ваши функции обратного вызова. Дополнительные сведения см. В разделе «Параметры URL-адреса и пользовательские данные» ниже.

Удаление целей для перетаскивания

Чтобы отсоединить ZeroUpload от ранее добавлена ​​цель перетаскивания, т.е. восстановление ее до исходного состояния, вы должны вызвать ZeroUpload.removeDropTarget () . Передайте любой селектор CSS или элемент DOM (все, что может решить jQuery). Пример:

 ZeroUpload. removeDropTarget ("#mydroparea"); 

Выбор файлов вручную

Помимо перетаскивания n 'drop, вы также можете вручную открыть диалоговое окно выбора файла ОС, чтобы пользователи могли выбрать файлы для загрузки, например, в ответ на событие щелчка. Для этого вызовите функцию ZeroUpload.chooseFiles () . Пример:

 ZeroUpload.chooseFiles (); 

Типичное использование этого - прикрепить его к событию щелчка на Элемент DOM, поэтому вы можете стилизовать кнопку «Загрузить» так, как вам нравится. Пример:

 
Загрузить файлы

Выбранные файлы загружаются немедленно, и ваш максимальный лимит файлов и ограничения по типам файлов применяются.

Каждый раз, когда вы вызываете chooseFiles () , вы можете укажите настраиваемый целевой URL, параметры запроса и/или элемент «пользовательские данные» для передачи произвольных данных в ваши функции обратного вызова. Дополнительные сведения см. В следующем разделе.

Параметры URL-адреса и данные пользователя

ZeroUpload реализован как синглтон, то есть там может быть только один экземпляр на каждой веб-странице. Однако вы можете настроить целевой URL, параметры запроса и/или включить пользовательские данные для каждой цели перетаскивания и каждого вызова chooseFiles () .

Для при настройке с помощью целей перетаскивания функция addDropTarget () принимает два дополнительных аргумента после селектора CSS. Первый может быть строкой, которая переопределяет целевой URL для загрузки, или хешем, который сериализуется в параметры запроса на существующем URL, установленном с помощью setURL () . Вот их примеры:

//сначала установите целевой URL-адрес по умолчанию ZeroUpload.setURL ("/path/to/default.php"); //цель перетаскивания не имеет дополнительных аргументов, поэтому просто используйте URL-адрес по умолчанию ZeroUpload.addDropTarget ("# droparea1"); //target указывает хэш, который сериализуется и добавляется к URL-адресу, например ///path/to/default.php?mykey=My%20Value ZeroUpload.addDropTarget ("# droparea2", {mykey: "My Value"}); //цель указывает строку, которая полностью заменяет целевой URL-адрес ZeroUpload.addDropTarget ("# droparea3", "/path/to/different.php"); 

URL-адрес может также можно изменить таким же образом при вызове chooseFiles () . Примеры:

 ZeroUpload.chooseFiles ();  ZeroUpload.chooseFiles ({mykey: "Мое значение"});  ZeroUpload.chooseFiles ("/path/to/different.php"); 

Помимо удаления с URL, эти функции также принимают дополнительный необязательный аргумент, который определяется как "данные пользователя". Это может быть любой тип данных (число, строка, объект и т. Д.), Который затем передается всем вашим функциям обратного вызова (см. События ниже). Пример:

 ZeroUpload.addDropTarget ("#mydroparea", "", {myuploadtype: "drop"});  ZeroUpload. chooseFiles ("", {myuploadtype: "click"}); 

Таким образом вы можете предоставить своим функциям обратного вызова информацию о том, как были загружены файлы (какая область перетаскивания использовалась , событие щелчка и т. д.). Две пустые строки в примере означают, что мы не изменяем URL-адрес, а указываем только данные пользователя (но вы, конечно, можете делать и то, и другое).

Стилизация перетаскивания при наведении

Вы можете обеспечить визуальную обратную связь, когда пользователь наводит курсор на ваши зоны перетаскивания, с помощью CSS. ZeroUpload добавит класс dragover к любым элементам DOM зоны перетаскивания, где указатель мыши зависает с файлами на буксире. Чтобы воспользоваться этим, просто определите класс CSS dragover , содержащий нужные вам эффекты. Вот пример:

 .dragover {box-shadow: # 00f 0px 0px 8px 2px;  } 

Это заставит все зоны перетаскивания светиться синим цветом при наведении на них файлов. Это тот же эффект, что и на демонстрационной тестовой странице.

Events

ZeroUpload запускает ряд событий в ответ на различные происходящие действия. Вы можете перехватить эти события и выполнить собственный код, например, отобразить индикатор выполнения загрузки, уведомление о завершении и/или диалоговое окно с ошибкой. Чтобы перехватить события, используйте функцию ZeroUpload.on () и передайте имя события и функцию обратного вызова. Вот все события, которые вы можете прослушивать:

Start Event

start событие запускается, когда начинается загрузка, либо из операции перетаскивания, либо из события щелчка. Вы можете использовать это для отображения диалогового окна выполнения загрузки, чтобы пользователь знал, что происходит. Пример:

 ZeroUpload.on ('start', function (files, userData) {//Загрузка началась!//`files` - это массив файлов в очереди на загрузку //`userData` - это значение ваших пользовательских данных, если применимо}); 

Аргумент files - это псевдо-массив (технически FileList но может повторяться, как настоящий массив), который содержит метаданные о каждом файле, поставленном в очередь для загрузки: свойство name с именем файла (без пути), размер с размером файла в байтах, type с MIME-типом файла и lastModifiedDate с датой изменения файла.

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

Событие выполнения

После начала загрузки ZeroUpload будет генерировать события выполнения несколько раз (много раз в секунду), что вы можете поймать и обновить, например, индикатор прогресса. В вашу функцию обратного вызова передается объект, который содержит множество свойств, которые вы можете использовать, которые подробно описывают текущую операцию загрузки. Вот пример:

 ZeroUpload.on ('progress', function (progress, userData) {//Выполняется загрузка.//`progress.amount` - это  прогресс загрузки от 0,0 до 1,0//`progress.percent` - это текстовый процент, например," 50% "//'userData' - значение ваших пользовательских данных, если применимо.}); 

Вот список всех свойств, доступных в объекте progress :

Свойство Тип Примечания
amount Number Десятичное число с плавающей запятой, представляющее общий прогресс загрузки, от 0,0 до 1.0.
percent Строка Строка, представляющая прогресс загрузки, например «45%».
elapsedRaw Number Истекшее время загрузки в секундах с высоким разрешением.
elapsedHuman String Истекшее время для загрузки в виде удобочитаемой строки, например «48 секунд» или «2 минуты».
dataSentRaw Number Количество отправленных байтов, например 4718592.
dataSentHuman String Объем отправленных на данный момент данных в виде удобочитаемой строки, например «4,5 МБ».
dataTotalRaw Number Общее количество байтов в загрузке, например 10485760.
dataTotalHuman Строка Общий объем данных в загрузке в виде удобочитаемой строки, например «10 МБ».
dataRateRaw Number Средняя скорость передачи данных в байтах в секунду.
dataRateHuman String Средняя скорость передачи данных в виде удобочитаемой строки, например «150 К/с».
RemainTimeRaw Number Расчетное оставшееся время, выраженное в секундах.
Остаточное времяЧеловек String Расчетное оставшееся время в виде удобочитаемой строки, например «4 минуты».
originalEvent Object Ссылка на исходное событие выполнения AJAX, созданное браузером.

Надеюсь, таблица не требует пояснений.. Вот более полный пример выполнения с использованием большего количества свойств. Предполагается, что на вашей странице есть элемент DOM с идентификатором #progress .

 ZeroUpload.on ('progress', function (progress, userData)  {$ ('# progress'). html ('
Progress: ' + progress.percent + ',' + progress.elapsedHuman + 'elapsed
' + '
Отправлено: '+ progress.dataSentHuman +' из '+ progress.dataTotalHuman +' ('+ progress.dataRateHuman +')
'+'
Осталось: '+ progress.remainingTimeHuman +'
');});

Это даст следующий результат:

  Ход выполнения: 45%, прошло 2 минуты Отправлено: 4,5 МБ из 10 МБ (150 К/сек) Осталось: 4 минуты  

Обычное использование для amount (которое будет числом от 0,0 до 1,0) предназначено для визуализации графического индикатора выполнения, обновляя ширину каждый раз, когда запускается событие выполнения. Вы можете сделать это с помощью CSS. Например, предположим, что у вас есть элемент контейнера шириной 200 пикселей и внутренний элемент (с другим цветом фона), который вы хотите «увеличивать» слева направо. Вот один из способов реализовать это:

 ZeroUpload.on ('progress', function (progress, userData) {var bar_width = Math.floor (progress.amount * 200  ); $ ('# myprogressbar'). css ('width', bar_width + 'px');}); 

Обратите внимание, что вы можете зарегистрировать только один прослушиватель событий для каждого событие (последнее преобладает), поэтому убедитесь, что вы обрабатываете все обновления, связанные с прогрессом, за один вызов ZeroUpload.on () .

Событие завершения

Когда загрузка завершена, и мы получаем успешный код HTTP от сервера , запускается событие завершения. В вашу функцию обратного вызова передается объект, содержащий фактический код ответа HTTP (например, 200), фактические необработанные данные с сервера (например, JSON) и некоторые другие свойства, которые описаны ниже. Вот пример:

 ZeroUpload.on ('complete', function (response, userData) {//Загрузка завершена!//`response.code` - это HTTP  код ответа, например 200//`response.data` - это необработанные данные с сервера//'userData' - это значение ваших пользовательских данных, если применимо.}); 

Если ваш серверный код отправляет ответ JSON, например, вам придется проанализировать его самостоятельно следующим образом:

 ZeroUpload.on ('complete', function (response  , userData) {//Загрузка завершена! var obj = JSON.parse (response. данные );  }); 

Вот список всех свойств, доступных в объекте response , переданном вашему обработчику завершения:

Свойство Тип Примечания
code Number Код ответа HTTP от сервер, например 200.
data String необработанные данные, отправленные обратно с сервера.
statusLine String Строка статуса HTTP, например "ОК".
xhr Object Ссылка на исходный объект XHR (AJAX).

Обратите внимание, что ZeroUpload определяет, была ли операция загрузки «успешной» на основе кода HTTP. отправлено обратно с сервера. Коды успешного ответа HTTP составляют от 200 до 399 включительно. Любое другое число считается ошибкой, , и в этом случае обработчик завершения не вызывается . Вместо этого запускается событие error (см. Следующий раздел).

Событие ошибки

При возникновении ошибки, которая может произойти до, во время или после загрузки, ZeroUpload выдает событие error . В вашу функцию обратного вызова передается уникальная строка идентификатора ошибки (см. Ниже) и описание ошибки. Настоятельно рекомендуется включить прослушиватель для этого события, поскольку по умолчанию отображается диалоговое окно предупреждения JavaScript. Пример:

 ZeroUpload.on ('error', function (type, message, userData) {//Произошла ошибка!//'type' будет одной из ошибок  Идентификаторы показаны ниже.//'message' - строка описания ошибки.//'userData' - значение ваших пользовательских данных, если применимо. Alert ("Ошибка загрузки:" + message);}); 

Предоставляется ошибка type , чтобы вы могли идентифицировать уникальную ошибку и, если хотите, предоставить собственную строку описания (возможно, на других языках). Вот таблица, в которой показаны все возможные типы ошибок с примерами описаний на английском языке:

Тип ошибки Пример описания
неподдерживаемый Ваш браузер не поддерживается.
maxfiles Выбрано слишком много файлов. Пожалуйста, выберите только N.
maxbytes Размер файла слишком велик: N байтов
тип файла Тип файла не принят: FILENAME (TYPE)
http Ошибка загрузки файлов: HTTP 403 запрещено
ajax Ошибка загрузки файлов: внутренняя ошибка

Ошибка типа http выдается, когда сервер отправляет неуспешный код ответа HTTP, например 404 (файл не найден), 500 (внутренняя ошибка сервера) и т. д.. Тип ошибки ajax - это внутренняя ошибка AJAX, которая, вероятно, является либо ошибкой поиска DNS по целевому URL, либо междоменной ошибкой.

Пользовательские данные на сервере

Вот дополнительный совет. Если ваши пользовательские данные представляют собой простой объект с одним или несколькими ключами и значениями, они становятся параметрами HTTP POST, отправляемыми на ваш серверный скрипт. Это означает, что вместе с данными загрузки файла в параметрах file1 , file2 , ... fileN все ваши пользовательские данные ключи и значения также включены. Так, например, если пользователь помещает файл в цель, инициализированную таким образом ...

 ZeroUpload.addDropTarget ("#mydroparea", "", {myuploadtype: "drop"  }); 

... вашему серверному скрипту будет передан параметр HTTP POST myuploadtype , установленный на drop вместе с данными загрузки двоичного файла. К этим значениям можно получить доступ, используя следующий код (здесь показан PHP):

 $ myuploadtype = $ _POST ['myuploadtype']; //"drop" 

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

Поддержка браузера

ZeroUpload должен нормально работать в Safari 5+, Chrome 7+, Firefox 4+ и IE 10+. Для получения дополнительной информации см. XHR2 на CanIUse.com.

Лицензия

Лицензия MIT (MIT)

Авторские права (c) 2011–2014 Джозеф Хакаби

Настоящим предоставляется бесплатное разрешение любому лицу, получившему копию этого программного обеспечения и связанных файлов документации («Программное обеспечение») для работы с Программным обеспечением без ограничений, включая, помимо прочего, права на использование, копирование, изменение, объединение, публикацию, распространение, сублицензирование и/или продажу копий Программного обеспечения, а также разрешать лицам, которым предоставляется Программное обеспечение, выполнять Итак, при соблюдении следующих условий:

Вышеупомянутое уведомление об авторских правах и это уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения.

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ЯВЛЯЕТСЯ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ​​ГАРАНТИЯМИ КОММЕРЧЕСКОЙ ЦЕННОСТИ, ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ И НЕЗАЩИТЫ ОТ ИНФОРМАЦИИ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ ВЛАДЕЛЬЦЫ АВТОРСКИХ ПРАВ НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ДРУГИЕ ОТВЕТСТВЕННОСТЬ, БЫЛИ В РЕЗУЛЬТАТЕ ДОГОВОРА, ПРАКТИЧЕСКИХ ПРАВ ИЛИ ИНЫХ СЛУЧАЕВ, ВОЗНИКАЮЩИХ, ВНУТРИ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ ДЕЛАМИ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.

Оцените статью
logicle.ru
Добавить комментарий