Django

Django — свободный фреймворк для веб-приложений на языке Python

  • You are not logged in.
  • Root
  • » Общий
  • » Запись в файл. Трабла с кодировкой [RSS Feed]

#1 Jan. 4, 2012 21:46:52

ecspertiza
Registered: 2010-08-11
Posts: 6
Reputation: +  0  -
Profile   Send e-mail  

Запись в файл. Трабла с кодировкой

Есть следующая задача. Отправить на сервер (Python + Django) файл, а там его сохранить. Собственно отправку организовал POST запросом, данные приходят хорошо. Но сохранить их не получается, пишу в файл следующим образом


def save_file(fn,data):
    file = open(fn, 'wb+')
    try:
        file.write(data)
    except Exception as err:    
        print (err)
  
    file.close()
    


на строке file.write(data) возникает ошибка


'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)


немного погуглив я нашел что ошибка связана с кодировкой и мол нужно писать следующим образом


file.write(data.encode("utf-8"))


так запись происходит хорошо, но размер передаваемого файла увеличивается почти в два раза, и стало быть он становится не читаемым, ибо передаю бинарные файлы. Собственно чё делать ? Как правильно писать?

Offline

#2 Jan. 5, 2012 21:49:12

ecspertiza
Registered: 2010-08-11
Posts: 6
Reputation: +  0  -
Profile   Send e-mail  

Запись в файл. Трабла с кодировкой

Нашел решение проблемы. Оказался целый комплекс мер которые нужно было предпринять, во первых я передавал данные формируя POST заголовок след. образом[Qt]


    QNetworkRequest request;

    QString unique = generateUnique();
    request.setRawHeader("Content-Type", "multipart/form-data; boundary="+unique.toUtf8());

    QString fileName = QFileDialog::getOpenFileName(0,"Select file","");
    QFileInfo fi(fileName);

    QByteArray data;
    data.append("--");
    data.append(unique);
    data.append("\r\n");
    data.append("Content-Disposition: form-data; name=\"data\"\r\n");
    data.append("Content-Type: application/octet-stream\r\n");
    data.append("Content-Transfer-Encoding: binary");
    data.append("\r\n\r\n");


    QFile file(fileName);
    file.open(QIODevice::ReadOnly);
    data.append(file.readAll());
    file.close();

    data.append("\r\n");
    data.append("--");
    data.append(unique);
    data.append("--\r\n");

    request.setRawHeader("Content-Length",QString::number(data.size()).toUtf8());
    request.setUrl(QUrl("http://127.0.0.1:8000/softupload/"));
    m_manager = new QNetworkAccessManager(this);
    m_manager->post(request, data);



при этом POST отправлялся хорошо, но на стороне сервера файл приходил в request.POST['data'] и стало быть хранился в unicode. С этим и была трабла. Для того что бы победить сию проблему всего лишь нужно изменить строчку


data.append("Content-Disposition: form-data; name=\"data\"; filename=\""+fi.fileName()+"\"\r\n");


тогда файлы будут попадать в request.FILES['data'] и будут иметь тип File, ну и стало быть проблемы с записью отпадут. Только и писать нужно не просто используя write, а используя следующую конструкцию


for chunk in data.chunks():
            file.write(chunk)


тогда запись будет происходить правильно

Offline

  • Root
  • » Общий
  • » Запись в файл. Трабла с кодировкой [RSS Feed]

Board footer

Moderator control

Powered by DjangoBB