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