2016-01-20 4 views
1

Я использую fabric.js для рисования аннотаций на странице. Теперь я хочу сохранить незагруженную страницу как есть, а не перерисовывать все элементы на стороне сервера с помощью JSON.canvas toDataURL() - операция небезопасна

У меня есть основное изображение загружается как:

function redrawPage(src) { 
       var deferred = $q.defer(); 

       fabric.Image.fromURL(src, function (img) { 
        zoom.reset(); 
        transformation.reset(); 

        mainImage = img; 
        mainImage.set({ 
         left: 0, 
         top: 0 
        }); 
        mainImage.hasRotatingPoint = true; 
        mainImage.selectable = false; 

        canvas.clear(); 
        canvas.setWidth(mainImage.getWidth()); 
        canvas.setHeight(mainImage.getHeight()); 
        canvas.add(mainImage); 

        canvas.renderAll(); 

        deferred.resolve(); 
       }); 

       return deferred.promise; 
      } 

и когда я хочу, чтобы отправить данные холст изображения должны быть сохранены в виде аннотированных версии оригинального изображения, я получаю «Операция небезопасна» ошибка.

function getImageData() { 
    var context = canvas.getContext('2d'), 
     imageData = context.getImageData(0, 0, canvas.width, canvas.height); 

    return imageData.data; 
} 

веб-сервер, с которого я загружаю изображения не позволяет crossOrigin установлен в положение «Anonymus»

ответ

3

Если хост изображение не разрешить анонимный доступ, то ваш .getImageData & .toDataURL всегда будет терпеть неудачу, потому что полотно испорчено. Никакого прочного решения для этого.

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

Существует несколько других обходных решений, в которых пользователь подтверждает, что они хотят, чтобы изображение загружалось по принципу кросс-оригинала. Вот соответствующий Stackoverflow post.

+0

Изображения отображаются в моем поддомене http // api.mdomain.com, но я не могу разрешить доступ к анонимному доступу CORS для всех запросов из соображений безопасности – dzona

+0

'' Сервер: сервер должен быть настроен для возврата заголовка (s), указывающий, что ответ содержит авторизованный контент. «Не могли бы вы дать мне пример того, как настроить сервер для достижения этого? – dzona

+1

Я собирался сказать :-) ... Помимо анонимного доступа вы также можете установить свое изображение сервер для доставки в авторизованные пункты назначения. Если ваш дизайн позволяет давать учетные данные вашим авторизованным клиентам, вы можете использовать изображения, совместимые с кросс-оригиналами, с учетными данными. Вот [авторитетная ссылка на настройку серверов с поддержкой CORS] (http://enable-cors.org/index.html). – markE

Смежные вопросы