Какой будет лучший способ конвертировать CSV-файл в Excel? - PullRequest
0 голосов
/ 24 июня 2019

Чтобы лучше познакомиться с django, я решил создать веб-сайт, который позволит пользователю загружать CSV-файл, который затем преобразуется в Excel, и пользователь сможет его скачать.

Чтобы добиться этого, я создал модель формы с одним model FileField с именем csv_file, как показано ниже:

#models.py

class CSVUpload(models.Model):
    csv_file = models.FileField(upload_to="csvupload/")

    def __str__(self):
        return self.csv_file


#forms.py   
class CsvForm(forms.ModelForm):
    class Meta:
        model = CSVUpload
        fields = ('csv_file', )

, и соответствующий вид:

from django.shortcuts import render, redirect
import pandas as pd
import os

#converts file from csv to excel  
def convertcsv2excel(filename):
    fpath = os.path.join(settings.MEDIA_ROOT + "\csvupload", filename)
    df = pd.read_csv(fpath)
    newfilename = str(filename) +".xlsx"
    newpathfile = os.path.join(settings.MEDIA_ROOT, newfilename)
    df.to_excel(newpathfile, encoding='utf-8', index=False)
    return newfilename

def csvtoexcel(request):
    if request.method == 'POST':
        form = CsvForm(request.POST, request.FILES)
        if form.is_valid():
           form.save()
           print(form.cleaned_data['csv_file'].name)
           convertcsv2excel(form.cleaned_data['csv_file'].name)
           return redirect('exceltocsv')
    else:
        form = CsvForm()
    return render(request, 'xmlconverter/csvtoexcel.html',{'form': form})

Прямо сейчас, как вы можете видеть, я использую Pandas для того, чтобы преобразовать CSV-файл в Excel в файл views.py.У меня вопрос: есть ли лучший способ сделать это (например, в модуле формы или модели), чтобы сделать файл Excel более эффективным для загрузки?

Я ценю любую помощь, которую вы можете предоставить!

1 Ответ

1 голос
/ 24 июня 2019

Во-первых, я хочу отметить, что ваш пример демонстрирует произвольную уязвимость при загрузке файлов.Pandas не проверяет формат файла для вас, поэтому как злоумышленник я могу просто загрузить что-то вроде malware.php.csv в ваш скрипт преобразования, и любой вредоносный код, который я включу, останется без изменений.Поскольку вы не проверяете, что содержимое этого файла, на самом деле, в формате CSV, то вы даете пользователям возможность напрямую загрузить файл с произвольным расширением и, возможно, выполнить код на своем веб-сайте.Поскольку вы отображаете формат xlsx на веб-странице таким, какой вы есть, есть большая вероятность, что кто-то может злоупотребить этим.Если это всего лишь ваш личный эксперимент, чтобы помочь себе познакомиться, это одно, но я настоятельно рекомендую не развертывать это в производстве.То, что вы делаете здесь, очень опасно.

Что касается вашей более насущной проблемы, я лично не знаком с Django, но это выглядит очень похоже на этот вопрос: Наличие Django для загрузки загружаемых файлов

В вашем случае вы не хотите фактически сохранять содержимое файла на свой сервер, а хотите обработать содержимое файла и вернуть его в тексте ответа.Модуль django smartfile выглядит как раз то, что вам нужно: https://github.com/smartfile/django-transfer

Он предоставляет компоненты для Apache, Nginx и lighttpd и должен позволить вам предоставить средства для предоставления файлов в ответе сразу же после запроса назагрузить / конвертировать файл.Я должен подчеркнуть, что вы должны быть очень осторожны с тем, где вы сохраняете эти файлы, проверяя их содержимое, убедитесь, что конечные пользователи не могут просматривать или выполнять эти файлы в контексте веб-сервера, и что они удаляются сразу после ответа, и файлуспешно отправлено.

Кто-то, более знакомый с Django, может смело поправлять меня или приводить пример кода, который можно использовать, но, по моему опыту, именно эта функция позволяет внедрить выполнение кода на вашем сайте.Обычно это плохая идея.

...