2016-10-01 4 views
0

Я пытаюсь обслуживать HTML-страницу с атрибутами SVG; поэтому, как только я нажму «Создать», я хочу, чтобы загрузить этот файл как .jpg вместо SVG. Я просмотрел несколько конвертеров, которые работают с командной строкой, например, так.Загрузить SVG как JPEG с использованием фляжки

os.system("rsvg-convert -h 32 save.svg > icon-32.jpg") 

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

without_filter = <svg viewBox="0 0 400 150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="background: #40484b;"> 
    <defs> 
     <!-- if you use the same shape multiple times, you put the reference here and reference it with <use> --> 
     <rect id="path-1" x="25" y="25" width="100" height="100"></rect> 
     <rect id="path-3" x="150" y="25" width="100" height="100"></rect> 
     <rect id="path-5" x="275" y="25" width="100" height="100"></rect> 

     <!-- gradient --> 
     <linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="gradient"> 
      <stop stop-color="#FF8D77" offset="0%"></stop> 
      <stop stop-color="#FFBDB1" offset="50%"></stop> 
      <stop stop-color="#F4E3F6" offset="100%"></stop> 
     </linearGradient> 

     <!-- clip-path --> 
     <clipPath id="clip"> 
      <circle cx="325" cy="75" r="50"></circle> 
     </clipPath> 

     <!-- filter --> 
     <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="glow"> 
      <feGaussianBlur stdDeviation="15" in="SourceGraphic"> 
       <animate attributeName="stdDeviation" attributeType="XML" 
        begin="0s" dur="0.25s" repeatCount="indefinite" 
        values="15;20;15"/> 
      </feGaussianBlur> 
     </filter> 
    </defs> 
    <g fill-rule="evenodd"> 
     <use xlink:href="#path-1" filter="url(#glow)" fill="#FF8D77" fill-opacity="0.5"></use> 
     <use xlink:href="#path-3" fill="url(#gradient)"></use> 
     <use xlink:href="#path-5" fill="#FF8D77" clip-path="url(#clip)"></use> 
    </g> 
</svg> 

Так что я пытаюсь загрузить (HTML), как .jpeg, как только пользователь нажмет «создать» Вот мой вид функции.

@app.route('/filters/<filename>', methods=['GET','POST']) 
def AddFiltersTag(filename): 
    form = AddFilterTags(request.form) 
    if form.validate_on_submit(): 
     html = re.sub(r'(.*?<defs>)(.*)', r'\g<1>' + add_filter_tag + add_filter + end_tag + '\g<2>', without_filter) 
     save_html = open('save.svg','wb') 
     save_html.write(html) 
     os.system("rsvg-convert -h 32 save.svg > icon-32.jpg") 
     return download_html 

Так что функция AddFilterTag запускается, когда пользователь нажимает кнопку «Отправить» в моей форме. но в этом случае я хочу загрузить, приведенный выше код просто сохраняет файл как .svg и преобразует его позже, используя os.system, но я хочу загрузить версию .jpg напрямую. Есть ли способ сделать это?

+0

Не пробовал это сам, так как я не использую флягу, но для библиотеки rsvg вы можете использовать привязки python, которые вы, возможно, захотите использовать. Таким образом, вы можете передать содержимое из «html» напрямую, а не записывать их в файл svg, который будет использоваться в качестве параметра в команде «rsvg-convert». – CodeSurgeon

ответ

0

Сохраните файл и преобразуйте его в изображение.

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

... 
os.system("rsvg-convert -h 32 save.svg > icon-32.jpg") 
return send_from_directory("/path/to/saved/image", "icon-32.jpg") 

Обязательно импортировать метод следующим образом:

from flask import send_from_directory 

Если вы используете это в производстве, убедитесь, что Nginx или фактический веб-сервер отправляет файл. Вы можете прочитать больше на http://flask.pocoo.org/docs/0.11/api/#flask.send_from_directory

+0

Эй, когда я нажимаю кнопку «Создать», он бросает мне 404 НЕ найден. –

+0

Это мой код.save_html = open ('static/save.svg', 'wb') save_html.write (html) transfer_file_name = 'icon-32.jpg' os.system ("rsvg-convert -h" + height + "" + имя_файла + ">" + имя_передачи_файла) return send_from_directory (app.static_folder, "icon-32.jpg") –