Home (original) (raw)

Create custom uploader

If you want to save images uploaded to your storage,MARTOR also provides a way to handle this by allowing you to use a custom uploader. The scripts below show how you could do this:

1. settings.py

Global martor settings

Input: string boolean, true/false

MARTOR_ENABLE_CONFIGS = { .... 'imgur': 'true', # to enable/disable imgur uploader/custom uploader. 'mention': 'true', # to enable/disable mention 'jquery': 'true', # to include/revoke jquery (require for admin default django) }

Upload to locale storage

import time MARTOR_UPLOAD_PATH = 'images/uploads/{}'.format(time.strftime("%Y/%m/%d/")) MARTOR_UPLOAD_URL = '/api/uploader/' # change to local uploader

Maximum Upload Image

2.5MB - 2621440

5MB - 5242880

10MB - 10485760

20MB - 20971520

50MB - 5242880

100MB 104857600

250MB - 214958080

500MB - 429916160

MAX_IMAGE_UPLOAD_SIZE = 5242880 # 5MB

Media Path

MEDIA_URL = '/media/' MEDIA_ROOT = '/path/to/yourenv/yourproject/media'

2. views.py

import os import json import uuid

from django.conf import settings from django.http import HttpResponse from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.decorators import login_required from django.core.files.storage import default_storage from django.core.files.base import ContentFile

from martor.utils import LazyEncoder

@login_required def markdown_uploader(request): """ Makdown image upload for locale storage and represent as json to markdown editor. """ if request.method == 'POST' and request.is_ajax(): if 'markdown-image-upload' in request.FILES: image = request.FILES['markdown-image-upload'] image_types = [ 'image/png', 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/gif' ] if image.content_type not in image_types: data = json.dumps({ 'status': 405, 'error': _('Bad image format.') }, cls=LazyEncoder) return HttpResponse( data, content_type='application/json', status=405)

        if image._size > settings.MAX_IMAGE_UPLOAD_SIZE:
            to_MB = settings.MAX_IMAGE_UPLOAD_SIZE / (1024 * 1024)
            data = json.dumps({
                'status': 405,
                'error': _('Maximum image file is %(size)s MB.') % {'size': to_MB}
            }, cls=LazyEncoder)
            return HttpResponse(
                data, content_type='application/json', status=405)

        img_uuid = "{0}-{1}".format(uuid.uuid4().hex[:10], image.name.replace(' ', '-'))
        tmp_file = os.path.join(settings.MARTOR_UPLOAD_PATH, img_uuid)
        def_path = default_storage.save(tmp_file, ContentFile(image.read()))
        img_url = os.path.join(settings.MEDIA_URL, def_path)

        data = json.dumps({
            'status': 200,
            'link': img_url,
            'name': image.name
        })
        return HttpResponse(data, content_type='application/json')
    return HttpResponse(_('Invalid request!'))
return HttpResponse(_('Invalid request!'))

3. urls.py

from yourapp.views import markdown_uploader

urlpatterns = [ .... url( r'^api/uploader/$', markdown_uploader, name='markdown_uploader_page' ), ]

To support Django 2 for the urls.py script in part 3 it would be good to also add:

from yourapp.views import markdown_uploader

urlpatterns = [ .... path( 'api/uploader/', markdown_uploader, name='markdown_uploader_page' ), ]

I hope this is useful, if you have any questions or anything let me know 👍