Anthony teşekkür :)
gibi yaptılar
Sadece dosyayı yeniden adlandırırsanız, bu indirme mekanizmasını bozar. Dahası, bazen dosyayı orijinalden farklı bir adla kaydetmek isteyebilirsiniz.
db.define_table("files",
Field("name", unique=True),
Field("file", "upload"))
Özelleştirilmiş mağaza ile yükleme alanını genişletmek ve fonksiyonlarını almak gerekir: Diyelim ki aşağıdaki modele sahip varsayalım
Field("file", "upload", custom_store=store_file, custom_retrieve=retrieve_file)
fonksiyonlar sadece yazıyoruz/sabit yükleme dizinden bir dosya okunurken :
import os
import shutil
def store_file(file, filename=None, path=None):
path = "applications/app_name/uploads"
if not os.path.exists(path):
os.makedirs(path)
pathfilename = os.path.join(path, filename)
dest_file = open(pathfilename, 'wb')
try:
shutil.copyfileobj(file, dest_file)
finally:
dest_file.close()
return filename
def retrieve_file(filename, path=None):
path = "applications/app_name/uploads"
return (filename, open(os.path.join(path, filename), 'rb'))
Şimdi denetleyicisi size veritabanı ekleme/güncelleme yapılmadan önce form.vars değiştirmek ve dosya adını ayarlamanız gerekir. Yüklenen dosyanın orijinal adını tutmak istiyorsanız, bu gerekli değildir.
def validate(form):
# set the uploaded file name equal to a name given in the form
if form.vars.file is not None:
form.vars.file.filename = form.vars.name
Ayrıca çalışmaz response.download İçine yerleştirilmiş olarak dosyayı indirmek için bir işlev tanımlamak gerekir:
import contenttype as c
def download():
if not request.args:
raise HTTP(404)
name = request.args[-1]
field = db["files"]["file"]
try:
(filename, file) = field.retrieve(name)
except IOError:
raise HTTP(404)
response.headers["Content-Type"] = c.contenttype(name)
response.headers["Content-Disposition"] = "attachment; filename=%s" % name
stream = response.stream(file, chunk_size=64*1024, request=request)
raise HTTP(200, stream, **response.headers)
noktaları birleştirmek için, formu oluşturmak gerekir. Aşağıdaki örnekte, eski okul formlarından daha iyi olan (ancak henüz kitapta belgelenmemiş) yeni kılavuz mekanizmasını kullanıyorum. request.vars.name_of_file.filename ile
def index():
if len(request.args):
form=SQLFORM(db.files, request.args[0], upload=URL("download"))
else:
form=SQLFORM(db.files, upload=URL("download"))
if form.process(onvalidation=validate).accepted:
response.flash = "files updated"
return {"form":form}
i orijinal dosya adını almak ama nasıl: Eğer ızgara tüm fanciness istemiyorsanız
, eşdeğer kontrolör kodudur yüklenen adını yeniden adlandır. os.rename ile yapmalı mıyım? Farklı zip dosyalarını yüklüyorum, bu yüzden isim_of_file.zip olması gerekiyor TEŞEKKÜR EDERİM – Yebach
Ayrıca, form.accepts komutunu atlayabilir ve dosyayı kendiniz kaydedebilirsiniz. Dizin traversal saldırılarına açık olacağından, bunu kullanıcı tarafından yüklenen dosyalarla yapmayın. – Anthony
web2py tarafından nasıl dosya kodlaması yapılmaz. Asıl yüklenen dosyanın orijinal dosya ismiyle bir klasörde saklanmasını istiyorum, çünkü daha sonra işlemek için başka bir betik var ve dosya adı dosya işleme için önemli? – Yebach