Найти - Пользователи
Полная версия: сохранение файлов из blob куда укажет пользователь
Начало » Web » сохранение файлов из blob куда укажет пользователь
1 2 3
Андрей Светлов
artemvv, давайте вы покажете ваш *неработающий* пример, а мы сообща его поправим.
Во первых, трудно гадать, где именно вы ошиблись
Во вторых, облегчите нам жизнь. Поправить ошибку куда быстрее, чем сделать демо с нуля. Тем более что нужно - вам.
igor.kaist
Да и еще… на какой OS вы свой пример запускаете?
artemvv
Сейчас запускаю на 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. Файл не сохраняется, а открыватеся в новом окне.
Александр Кошелев
А вы отладку проводили? Заголовки от сервера смотрели? Файлы не сравнивали? Гуглили?

Какие результаты?
slav0nic
для начала
print 'Content-Disposition: attachment; filename=1.pdf\n\n'
artemvv
Файлы получается сравнить, только если, я меняю, вопреки всем советам, 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
Не знаю как на маке, но на винде определенно с этим проблемы есть.
В соседней ветке это обсуждалось, правда по поводу upload, но корень проблемы, как мне кажется в том же.
Винда, кстати вместо \n, сама исправляет на \r\n.
http://python.su/forum/viewtopic.php?id=5646
pasaranax
Вы не забывайте, что 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
pasaranax, спасибо за совет, действительно с таким количеством переводов строк, как вы указали, браузер корекктно воспринимает указание Content-Disposition и предлагает открыть или сохранить файл под именем 1.pdf, и даже сохраняет, но опять же при этом изменяя его. То же самое происходит при выводе с помощью sys.stdout.write.

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

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

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

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

На маке тоже всё отлично!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB