Page tree
Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 31 Next »

  • 예제에서 
    • 프로젝트 이름은 synapeditor_django입니다.
    • 앱 이름은 edit입니다.

0. 사전작업

앱 등록

# 프로젝트 settings.py
...
INSTALLED_APPS = [
	'edit.apps.EditConfig', #앱 등록
	...
]
...


# 프로젝트 urls.py
...
urlpatterns = [
	path('edit/', include('edit.urls')), # 앱에서 사용할 url 등록 
	...
]
...

1. 이미지 업로드(동영상, 파일 업로드도 동일)

  • 예제에서 
    • 이미지 업로드는 media 디렉토리에 합니다.
    • 이미지 업로드 API는 '/edit/uploadFile'입니다. 

에디터 설정

// 사이냅에디터 설정 객체
var SynapEditorConfig = {
	...
	'editor.upload.image.param': {
		'csrfmiddlewaretoken': '{{ csrf_token }}'
	},
	'editor.upload.image.api': '/edit/uploadFile',
	...
}

업로드 경로 설정

# 프로젝트 settings.py
...
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
...

# 프로젝트 urls.py
...
urlpatterns = [
	...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
...

url과 view 연동

# 앱 urls.py
from django.urls import path
from . import views

urlpatterns = [
	...
    path('uploadFile/', views.upload_file, name='upload_file'),
	...
]

view 생성

  • 업로드 후 JSON 객체에 'uploadPath' 를 담아 응답해야 합니다.
# 앱 views.py
from django.http import JsonResponse
from .forms import UploadFileForm

# 파일을 업로드합니다.
def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        
        if form.is_valid():
            uploaded_file = form.save()
			data = {
				'uploadPath': uploaded_file.file.url
			}
    return JsonResponse(data)

form 생성

# 앱 forms.py
from .models import UploadFile
from django import forms

class UploadFileForm(forms.ModelForm):
    class Meta:
        model = UploadFile
        fields = ('file', )

model 생성

# 앱 models.py
import uuid
from django.db import models

# 저장할 파일 이름을 반환합니다.
def get_file_name(instance, filename):
    ext = filename.split('.')[-1]
    return "%s.%s" % (uuid.uuid4(), ext)

class UploadFile(models.Model):
    file = models.FileField(upload_to=get_file_name)

2. 문서 임포트

  • 예제에서
    • 문서 업로드는 media 디렉토리에 합니다.
    • 변환된 결과물은 media/output 디렉토리에 저장합니다.
    • 문서 임포트 API는 '/edit/importDoc'입니다. 

에디터 설정

// 사이냅에디터 설정 객체
var SynapEditorConfig = {
	...
	'editor.import.param': {
		'csrfmiddlewaretoken': '{{ csrf_token }}'
	},
	'editor.import.api': '/edit/importDoc/',
	...
}

업로드 경로 설정

# 프로젝트 settings.py
...
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
...

# 프로젝트 urls.py
...
urlpatterns = [
	...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
...

url과 view 연동

# 앱 urls.py
from django.urls import path
from . import views

urlpatterns = [
	...
    path('importDoc/', views.import_doc, name='import_doc'),
	...
]

view 생성

  • 임포트 후 JSON 객체에 'serializedData'와 'importPath' 를 담아 응답해야 합니다.
# 앱 views.py
import os
import zipfile
import zlib
from django.conf import settings
from subprocess import call
from django.http import JsonResponse
from .forms import UploadFileForm

PROJECT_PATH = os.path.abspath(os.path.dirname(__name__)) # 프로젝트의 절대경로
MEDIA_ROOT = settings.MEDIA_ROOT # 파일이 업로드 되는 절대경로
# 문서를 임포트 합니다.
def import_doc(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)

        if form.is_valid():
            uploaded_file = form.save()

			# 1. 문서 변환
            result = execute_converter(uploaded_file.file)
            
            if result['resultCode'] == 0:
                output_path = result['outputPath']
				# 2. 변환된 결과물 압축 해제
                unzip_path = unzip(output_path)
                pb_path = unzip_path + '/document.word.pb'

				# 3. PB 데이터 직렬화
                serialized_data = serialize_pb(pb_path)
                common_prefix = os.path.commonprefix([output_path, PROJECT_PATH])
                import_path = '/' + os.path.relpath(unzip_path, common_prefix)
            
            data = {
                'serializedData': serialized_data, # serialized된 pb 데이터
                'importPath': import_path # 변환 결과물이 저장된 경로(브라우저에서 접근 가능한 경로여야 함)
            }
    return JsonResponse(data)

# 변환모듈을 실행하여 문서를 변환합니다.
def execute_converter(file):
    fname, ext = os.path.splitext(file.name)
    module_path = '{0}/sedocConverter/sedocConverter_exe'.format(PROJECT_PATH)
    font_path = '{0}/sedocConverter/fonts'.format(PROJECT_PATH)
    input_path = file.path
    output_path = '{0}/output/{1}.zip'.format(MEDIA_ROOT, os.path.basename(fname))
    temp_path = '{0}/temp'.format(PROJECT_PATH)
    cmd = '{0} -z -f {1} {2} {3} {4}'.format(module_path, font_path, input_path, output_path, temp_path)
    result_code = os.system(cmd)

    return {
		'resultCode': result_code, 
		'outputPath': output_path
	}

#변환된 파일의 압축을 해제합니다.
def unzip(zipFilePath):
    unzip_path, ext = os.path.splitext(zipFilePath)
    zip = zipfile.ZipFile(zipFilePath)
    zip.extractall(unzip_path)

    return unzip_path

# pb파일을 읽어 serialize하여 반환합니다.
def serialize_pb(pbFilePath):
    serialized_data = []
    pb_file = open(pbFilePath, 'rb')
    pb_file.seek(16)
    pb_contents= pb_file.read()
    decompressed = zlib.decompress(pb_contents)
    
	for byte in decompressed:
        serialized_data.append(byte & 0xFF)

    pb_file.close()
    
	return serialized_data

form 생성

# 앱 forms.py
from .models import UploadFile
from django import forms

class UploadFileForm(forms.ModelForm):
    class Meta:
        model = UploadFile
        fields = ('file', )

model 생성

# 앱 models.py
import uuid
from django.db import models

# 저장할 파일 이름을 반환합니다.
def get_file_name(instance, filename):
    ext = filename.split('.')[-1]
    return "%s.%s" % (uuid.uuid4(), ext)

class UploadFile(models.Model):
    file = models.FileField(upload_to=get_file_name)
  • No labels