Вюха, яка зберігає завантажений файл.
    Структура запиту:
        FILES
            images[]: файли зображеннь
        POST DATA
            profile: назва профілю (для визначення налаштувань збреження) (опціонально)
            label: додаток до назви файлу при збереженні (опціонально)
    Структура відповіді:
        Тип відповіді: JSON
        {
            'uploaded': [
                {
                    'url': 'повний url до головного файла',
                    'rel_url': 'відносний від MEDIA url головного файла',
                    'img_id': 'ідентифікатор для збереження в БД',  // 'profilename:abcdef_abcd_label.png',
                    'variants': {
                        'variant label': {
                            'url': 'повний url до варіанта',
                            'rel_url': 'відносний від MEDIA url головного файла'
                        },
                        ...
                    }
                },
                ...
            ],
            'errors': ['error message', ...]
        }

def upload_image(request):
    """
    Вюха, яка зберігає завантажений файл.
    Структура запиту:
        FILES
            images[]: файли зображеннь
        POST DATA
            profile: назва профілю (для визначення налаштувань збреження) (опціонально)
            label: додаток до назви файлу при збереженні (опціонально)
    Структура відповіді:
        Тип відповіді: JSON
        {
            'uploaded': [
                {
                    'url': 'повний url до головного файла',
                    'rel_url': 'відносний від MEDIA url головного файла',
                    'img_id': 'ідентифікатор для збереження в БД',  // 'profilename:abcdef_abcd_label.png',
                    'variants': {
                        'variant label': {
                            'url': 'повний url до варіанта',
                            'rel_url': 'відносний від MEDIA url головного файла'
                        },
                        ...
                    }
                },
                ...
            ],
            'errors': ['error message', ...]
        }
    """
    if request.method != 'POST':
        return HttpResponseNotAllowed(('POST',))
    result = {'uploaded': [], 'errors': []}
    files = request.FILES.getlist('images[]')
    if not files:
        result['errors'].append(unicode(ERROR_MESSAGES['no_uploaded_files']))
        return send_json(result)
    try:
        profile = request.POST.get('profile', 'default')
        conf = get_profile_configs(profile)
    except ValueError, e:
        result['errors'].append(unicode(e))
        return send_json(result)
    for i in xrange(min(len(files), dju_settings.DJU_IMG_UPLOAD_MAX_FILES)):
        f = files[i]
        if not is_image(f, types=conf['TYPES']):
            result['errors'].append(
                unicode(ERROR_MESSAGES['wrong_file_format']) %
                {'name': f.name, 'formats': ', '.join(map(lambda t: t.upper(), conf['TYPES']))}
            )
            continue
        adjust_image(f, max_size=conf['MAX_SIZE'], new_format=conf['FORMAT'],
                     jpeg_quality=conf['JPEG_QUALITY'], fill=conf['FILL'], stretch=conf['STRETCH'])
        img_id = generate_img_id(profile, ext=image_get_format(f),
                                 label=request.POST.get('label'), tmp=True)
        relative_path = get_relative_path_from_img_id(img_id)
        full_path = media_path(relative_path)
        save_file(f, full_path)
        data = {
            'url': settings.MEDIA_URL + relative_path,
            'rel_url': relative_path,
            'img_id': img_id,
            'variants': {},
        }
        for v_conf in conf['VARIANTS']:
            label = v_conf['LABEL']
            if not label:
                label = get_variant_label(v_conf)
            v_f = adjust_image(f, max_size=v_conf['MAX_SIZE'], new_format=v_conf['FORMAT'],
                               jpeg_quality=v_conf['JPEG_QUALITY'], fill=v_conf['FILL'],
                               stretch=v_conf['STRETCH'], return_new_image=True)
            v_relative_path = get_relative_path_from_img_id(img_id, variant_label=label,
                                                            ext=image_get_format(v_f))
            v_full_path = media_path(v_relative_path)
            save_file(v_f, v_full_path)
            data['variants'][label] = {
                'url': settings.MEDIA_URL + v_relative_path,
                'rel_url': v_relative_path,
            }
        result['uploaded'].append(data)
    return send_json(result)