Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

0. 사전작업

앱 등록

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


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

...

에디터 설정

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

업로드 경로 설정

Code Block
languagepy
themeEmacs
# 프로젝트 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 연동

Code Block
languagepy
themeEmacs
# 앱 urls.py
from django.urls import path
from . import views

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

...

  • 업로드 후 JSON 객체에 'uploadPath' 를 담아 응답해야 합니다.
Code Block
languagepy
themeEmacs
# 앱 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 생성

Code Block
languagepy
themeEmacs
# 앱 forms.py
from .models import UploadFile
from django import forms

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

model 생성

Code Block
languagepy
themeEmacs
# 앱 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)

...

에디터 설정

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

업로드 경로 설정

Code Block
languagepy
themeEmacs
# 프로젝트 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 연동

Code Block
languagepy
themeEmacs
# 앱 urls.py
from django.urls import path
from . import views

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

...

  • 임포트 후 JSON 객체에 'serializedData'와 'importPath' 를 담아 응답해야 합니다.
Code Block
languagepy
themeEmacs
# 앱 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 생성

Code Block
languagepy
themeEmacs
# 앱 forms.py
from .models import UploadFile
from django import forms

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

model 생성

Code Block
languagepy
themeEmacs
# 앱 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)

...