Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Web
  • » сохранение файлов из blob куда укажет пользователь [RSS Feed]

#1 Дек. 10, 2009 00:29:35

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

сохранение файлов из blob куда укажет пользователь

artemvv, давайте вы покажете ваш *неработающий* пример, а мы сообща его поправим.
Во первых, трудно гадать, где именно вы ошиблись
Во вторых, облегчите нам жизнь. Поправить ошибку куда быстрее, чем сделать демо с нуля. Тем более что нужно - вам.



Офлайн

#2 Дек. 10, 2009 10:35:29

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

сохранение файлов из blob куда укажет пользователь

Да и еще… на какой OS вы свой пример запускаете?



Офлайн

#3 Дек. 10, 2009 11:40:39

artemvv
От:
Зарегистрирован: 2009-12-08
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранение файлов из blob куда укажет пользователь

Сейчас запускаю на windows XP, но дома на Mac OS аналогично. испрользую CGI.

Специально создал test.py:

#!/Python25/python
# -*- coding: utf-8 -*
import MySQLdb

conn = MySQLdb.connect(host="localhost", db="artemvv", user="artemvv", passwd="elochka")
conn.set_character_set('utf8')

cursor = conn.cursor(MySQLdb.cursors.DictCursor)
cursor.execute("""
SELECT file
FROM information
WHERE id = 1
""")
row = cursor.fetchone()

print 'Content-type: application/pdf \n'
print 'Content-Disposition: attachment; filename=1.pdf'
print row["file"]

file = open('/Temp/1.pdf', "wb")
file.write(row["file"])
file.close()

cursor.close()
Сохраняю в файл C:\Temp\1.pdf только для проверки, что файл в порядке.

Что не так:
1. Файл битый. Adobe Reader внутри браузера выдаёт: There was an error processing a page. Invalid Function resource.
2. Файл не сохраняется, а открыватеся в новом окне.



Офлайн

#4 Дек. 10, 2009 12:34:12

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

сохранение файлов из blob куда укажет пользователь

А вы отладку проводили? Заголовки от сервера смотрели? Файлы не сравнивали? Гуглили?

Какие результаты?



Офлайн

#5 Дек. 10, 2009 13:18:58

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

сохранение файлов из blob куда укажет пользователь

для начала

print 'Content-Disposition: attachment; filename=1.pdf\n\n'

Офлайн

#6 Дек. 10, 2009 14:32:03

artemvv
От:
Зарегистрирован: 2009-12-08
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранение файлов из blob куда укажет пользователь

Файлы получается сравнить, только если, я меняю, вопреки всем советам, application/pdf, например, на application/x-force-download.

Результаты:
1. Браузер не понимает Content-Disposition, сколько бы переводов строки не указывать: \n\n или \n, или ни одного. Всё время добавляет его внутрь pdf-файла.
2. Если я удаляю строку с Content-Disposition, то файл сохраняется под именем test.py. Сравнивая полученный и нормальный pdf блокноте видно, что заголовок файла верен, конец верен (eof), НО в конце много лишних перевод строк, т.е. одна длинная строка в оригинальном файле разбивается на множество коротких. В результате Adobe Acrobat открывает пустой pdf-файл.



Офлайн

#7 Дек. 10, 2009 14:42:20

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

сохранение файлов из blob куда укажет пользователь

Не знаю как на маке, но на винде определенно с этим проблемы есть.
В соседней ветке это обсуждалось, правда по поводу upload, но корень проблемы, как мне кажется в том же.
Винда, кстати вместо \n, сама исправляет на \r\n.
http://python.su/forum/viewtopic.php?id=5646



Отредактировано (Дек. 10, 2009 14:43:29)

Офлайн

#8 Дек. 11, 2009 00:25:51

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранение файлов из blob куда укажет пользователь

Вы не забывайте, что print перевод строки добавляет. Правильно должно быть так:

print 'Content-type: application/pdf'
print 'Content-Disposition: attachment; filename=1.pdf\n' # 2 перевода строки, значит дальше идет сожержимое файла
print row["file"]
Кстати, в конце выведенного файла вроде как тоже должен дописаться перевод строки. Я правда с вебом в питоне не работал никогда, но может стоит использовать sys.stdout.write?
sys.stdout.write('''Content-type: application/pdf
Content-Disposition: attachment; filename=1.pdf

%s''' % row["file"])



Отредактировано (Дек. 11, 2009 00:31:07)

Офлайн

#9 Дек. 11, 2009 08:48:23

artemvv
От:
Зарегистрирован: 2009-12-08
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранение файлов из blob куда укажет пользователь

pasaranax, спасибо за совет, действительно с таким количеством переводов строк, как вы указали, браузер корекктно воспринимает указание Content-Disposition и предлагает открыть или сохранить файл под именем 1.pdf, и даже сохраняет, но опять же при этом изменяя его. То же самое происходит при выводе с помощью sys.stdout.write.

Ясравнивал в блокноте и pdf и doc и jpg. По содержанию файлы одинаковы, но разница в переводах строк и наверное в символах табуляции…
Размер файла чуть-чуть величивается. Может быть какое-нибудь несоотвествие кодировок?

Хотел вставить для сравнения два файла jpg на форум, но после копирования из блокнота они оказались одинаковыми, так что не имеет смысла.



Отредактировано (Дек. 11, 2009 09:03:31)

Офлайн

#10 Дек. 11, 2009 09:30:08

artemvv
От:
Зарегистрирован: 2009-12-08
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

сохранение файлов из blob куда укажет пользователь

igor.kaist, спасибо вам, взял информацию с другой ветки форума:

if sys.platform == “win32”:
import msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)

Всё работает, файлы сохраняются нормально.

На маке тоже всё отлично!



Отредактировано (Дек. 11, 2009 20:15:26)

Офлайн

  • Начало
  • » Web
  • » сохранение файлов из blob куда укажет пользователь[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version