2015-12-06 5 views
1

Я разрабатываю простой webapp в web2py, и я хочу создать ссылку, которая позволит пользователю загрузить файл. Например:Как пользовательская функция загрузки Web2py

<a href="{{=URL('download',args = FILE)}}" download> 

Однако, я хочу сделать это, не передавая ФАЙЛ пользователю в обработчике страницы. Я хочу, чтобы получить идентификатор с сервера асинхронно, который будет соответствовать файлу я хочу, чтобы загрузить и передать его в пользовательскую функцию загрузки, как это:

<a href="{{=URL('custom_download',args = FILEID)}}" download> 

Таким образом, я буду иметь возможность загружать файлы сервер асинхронно (я уже понял, как это сделать), и ссылка для загрузки на странице для этого файла будет работать сразу же без перезагрузки страницы.

Таким образом, на стороне сервера, я хотел бы сделать что-то вроде этого:

def custom_download(): 
    download_row = db(db.computers.FILEID == request.args(0)).select() 
    download_file = download_row.filefield 
    return download_file 

Однако, я не совсем уверен, что мне нужно написать для того, чтобы это работало.

ответ

3

Я предположил, что ваши файлы хранятся в папке uploads, то пользовательская функция загрузки будет:

def custom_download():  
    download_row = db(db.computers.FILEID == request.args(0)).select().first() 
    download_file = download_row.filefield 

    # Name of file is table_name.field.XXXXX.ext, so retrieve original file name 
    org_file_name = db.computers.filefield.retrieve(download_file)[0] 
    file_header = "attachment; filename=" + org_file_name 

    response.headers['ContentType'] = "application/octet-stream" 
    response.headers['Content-Disposition'] = file_header 

    file_full_path = os.path.join(request.folder, 'uploads', download_file) 
    fh = open(file_full_path, 'rb') 
    return response.stream(fh) 
Смежные вопросы