Андрей Светлов
Дек. 10, 2009 00:29:35
artemvv, давайте вы покажете ваш *неработающий* пример, а мы сообща его поправим.
Во первых, трудно гадать, где именно вы ошиблись
Во вторых, облегчите нам жизнь. Поправить ошибку куда быстрее, чем сделать демо с нуля. Тем более что нужно - вам.
igor.kaist
Дек. 10, 2009 10:35:29
Да и еще… на какой OS вы свой пример запускаете?
artemvv
Дек. 10, 2009 11:40:39
Сейчас запускаю на 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. Файл не сохраняется, а открыватеся в новом окне.
Александр Кошелев
Дек. 10, 2009 12:34:12
А вы отладку проводили? Заголовки от сервера смотрели? Файлы не сравнивали? Гуглили?
Какие результаты?
slav0nic
Дек. 10, 2009 13:18:58
для начала
print 'Content-Disposition: attachment; filename=1.pdf\n\n'
artemvv
Дек. 10, 2009 14:32:03
Файлы получается сравнить, только если, я меняю, вопреки всем советам, application/pdf, например, на application/x-force-download.
Результаты:
1. Браузер не понимает Content-Disposition, сколько бы переводов строки не указывать: \n\n или \n, или ни одного. Всё время добавляет его внутрь pdf-файла.
2. Если я удаляю строку с Content-Disposition, то файл сохраняется под именем test.py. Сравнивая полученный и нормальный pdf блокноте видно, что заголовок файла верен, конец верен (eof), НО в конце много лишних перевод строк, т.е. одна длинная строка в оригинальном файле разбивается на множество коротких. В результате Adobe Acrobat открывает пустой pdf-файл.
igor.kaist
Дек. 10, 2009 14:42:20
Не знаю как на маке, но на винде определенно с этим проблемы есть.
В соседней ветке это обсуждалось, правда по поводу upload, но корень проблемы, как мне кажется в том же.
Винда, кстати вместо \n, сама исправляет на \r\n.
http://python.su/forum/viewtopic.php?id=5646
pasaranax
Дек. 11, 2009 00:25:51
Вы не забывайте, что 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"])
artemvv
Дек. 11, 2009 08:48:23
pasaranax, спасибо за совет, действительно с таким количеством переводов строк, как вы указали, браузер корекктно воспринимает указание Content-Disposition и предлагает открыть или сохранить файл под именем 1.pdf, и даже сохраняет, но опять же при этом изменяя его. То же самое происходит при выводе с помощью sys.stdout.write.
Ясравнивал в блокноте и pdf и doc и jpg. По содержанию файлы одинаковы, но разница в переводах строк и наверное в символах табуляции…
Размер файла чуть-чуть величивается. Может быть какое-нибудь несоотвествие кодировок?
Хотел вставить для сравнения два файла jpg на форум, но после копирования из блокнота они оказались одинаковыми, так что не имеет смысла.
artemvv
Дек. 11, 2009 09:30:08
igor.kaist, спасибо вам, взял информацию с другой ветки форума:
if sys.platform == “win32”:
import msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
Всё работает, файлы сохраняются нормально.
На маке тоже всё отлично!