@anton99zel
29а класс средней школы №7

Как реализуется загрузка фото на сайт с предварительной обработкой и предпросмотром?

Сейчас на сайте есть кнопка
<input type="file" class="upload" id="photo-upload"/>

и такой код
spoiler
function uploadPhoto(e) {
        document.getElementById('image').classList.remove('tr__hidden');
        document.getElementById('video').classList.add('tr__hidden');
        var event = new CustomEvent('uploadPhoto', {
            bubbles: true,
            cancelable: true,
            detail: {
                inputElement: document.getElementById('photo-upload'),
                submitPath: '/custom/show/uploader.php',
                postFileName: 'afile',
                trackerCanvas: document.getElementById('image'),
                success: addUserPhoto,
                error: function(data) {

                }
            }
        });

На странице есть кнопка, в обзоре выбираем фотку с компа, она появляется тут же на странице в нужном месте. Но бывает, что фото грузится перевернутым, либо на 90, либо 180 градусов.
Хочу переворачивать фото до загрузки его на страницу, т.е. чтобы было так:
Нажав загрузить фото, появлялась какая-либо страница предварительной загрузки или предпросмотра, где была бы кнопка поворота изображения. Если все нормально, то подтверждаем загрузку на сайт, иначе тоже, но после применения поворота.
От знатоков хотел бы получить умные мысли и примеры для дальнейшего изучения как это сделать.
  • Вопрос задан
  • 12125 просмотров
Пригласить эксперта
Ответы на вопрос 3
petermzg
@petermzg
Самый лучший программист
img {
  transform: rotate(180deg);
}
Ответ написан
@ynblpb_spb
дятел php
https://gist.github.com/runeb/c11f864cd7ead969a5f0

и на сервер слать base64
Ответ написан
Комментировать
Jeer
@Jeer
уверенный пользователь
В общем, реализуется следующим образом:
на форму помещаете:
<img id="blah" src="~/App_Img/noimg.png" alt="your image" /><br />
<input type="file" name="AddImage" id="AddImage" accept="image/*" />


Затем добавляете яваскриптовый обработчик, который при выборе файла в инпуте подставит картинку в этот верхний тег img, что-то типа такого:

function readURL(input) {
        if (input.files && input.files[0]) {
            var reader = new FileReader();

            reader.onload = function (e) {
                $('#blah').attr('src', e.target.result);

                var widthImg = $('#blah').width();
                console.log("widthImg = " + widthImg);
                var widthContent = 342;
                console.log("widthContent = " + widthContent);

                //если ширина картинки больше, чем наш контент, то добавляем коеффициент сжатия
                if (+widthImg > +widthContent) {
                    var koef = +widthImg / +widthContent;
                    
                    $("#koef").val(Math.round(koef*1000));
                    $('#blah').attr('src', e.target.result).css('width', '100%');
                }
                else {

                }
                //addJCrop(1);
                //jcrop_api.animateTo(getRandom());
            }
            reader.readAsDataURL(input.files[0]);
        }
    }

$("#AddImage").change(function () {
        $('#blah').attr('src', "~/Content/nophoto.png");
        readURL(this);

        //$('input[type="file"]').hide();
        //$('.buttonSubmitImg').show();
        //CropResult.isUpload = true;
    });


После этого вы проделываете какие-то операции с этим прелоадером, а результат складываете в скрытые поля на форме. Не сам результат (то, что у вас получилось с фоткой), а результат работы ваших функций. В моём случае я пользовался библиотекой jcrop, в скрытые поля я пихал x0, y0, x1, y1. На сервер передаётся в таком случае исходный не тронутый файл и координаты диагонали, по которой уже на сервере еще раз обрезается фотография и сохраняется уже изменённая.
В вашем случае нужно на яваскрипте реализовать повороты влево/вправо, на клиенте поворачивать с помощью css, а на сервер передать саму фотку и какой-нибудь rotateAngle - с помощью которого уже на сервере повернуть фотку перед сохранением.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы