假设您想在某处保存一堆文件,例如在BLOB中.假设你想通过网页将这些文件输出,并让客户端自动打开正确的应用程序/查看器.
假设:浏览器通过HTTP响应中的mime-type(content-type?)标头确定要使用的应用程序/查看器.
基于该假设,除了文件的字节外,您还希望保存MIME类型.
您如何找到文件的MIME类型?我目前在Mac上,但这也适用于Windows.
将文件发布到网页时,浏览器是否会添加此信息?
是否有一个整洁的python库来查找这些信息?WebService或(甚至更好)可下载的数据库?
我正在使用 Flasksend_file()来让人们从服务器下载文件。
我目前的代码如下:
@app.route('/', methods=["GET", "POST"])
def index():
if request.method == "POST":
link = request.form.get('Link')
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
info_dict = ydl.extract_info(link, download=False)
video_url = info_dict.get("url", None)
video_id = info_dict.get("id", None)
video_title = info_dict.get('title', None)
ydl.download([link])
print("sending file...")
send_file("dl/"+video_title+".f137.mp4", as_attachment=True)
print("file sent, deleting...")
os.remove("dl/"+video_title+".f137.mp4")
print("done.")
return render_template("index.html", message="Success!")
else:
return render_template("index.html", message=message)
Run Code Online (Sandbox Code Playgroud)
我.f137.mp4添加的唯一原因是因为我使用 AWS C9 作为我的在线 IDE,并且我无法安装 FFMPEG 来在 Amazon Linux 上组合音频和视频。然而,这不是问题。问题是它没有发送下载请求。
这是控制台输出:
127.0.0.1 - - [12/Dec/2018 16:17:41] "POST / HTTP/1.1" 200 -
[youtube] 2AYgi2wsdkE: Downloading …Run Code Online (Sandbox Code Playgroud) 我有一个基于Flask的网站,用户可以下载一些PDF文件.
这很容易使用Flask send_file()和send_from_directory().
例如:
@app.route('/downloadreport')
def download_report():
return send_from_directory(
'/reports',
'my_report.pdf',
as_attachment=True)
Run Code Online (Sandbox Code Playgroud)
我想在下载完成后执行一些逻辑(让我们称之为after_download()).
我试过使用@after_this_request钩子.但它看起来像是send_file()异步运行,因此@after_this_request可能会在下载文件之前触发.
@after_this_request在下载文件时似乎会触发.send_file()使用WSGI的文件包装器来实现下载......也许这就是为什么它以异步方式运行?有没有一种方法来调用after_download(),这样它保证后运行send_file()已完成的文件发送到用户?
我有一个Flask视图,它生成数据并将其保存为带有Pandas的CSV文件,然后显示数据.第二个视图用于生成的文件.我想在下载后删除该文件.我当前的代码引发了权限错误,可能是因为after_request在文件提供之前删除了该文件send_from_directory.如何在提供文件后删除文件?
def process_data(data)
tempname = str(uuid4()) + '.csv'
data['text'].to_csv('samo/static/temp/{}'.format(tempname))
return file
@projects.route('/getcsv/<file>')
def getcsv(file):
@after_this_request
def cleanup(response):
os.remove('samo/static/temp/' + file)
return response
return send_from_directory(directory=cwd + '/samo/static/temp/', filename=file, as_attachment=True)
Run Code Online (Sandbox Code Playgroud) 这是我的功能,即动创建文件(当用户点击正确的链接时)
@app.route('/survey/<survey_id>/report')
def survey_downloadreport(survey_id):
survey, bsonobj = survey_get(survey_id) #get object
resps = response_get_multi(survey_id) #get responses to the object
fields = ["_id", "sid", "date", "user_ip"] #meta-fields
fields.extend(survey.formfields) #survey-specific fields
randname = "".join(random.sample(string.letters + string.digits, 15)) + ".csv" #some random file name
with open("static//" + randname, "wb") as csvf:
wr = csv.DictWriter(csvf, fields, encoding = 'cp949')
wr.writerow(dict(zip(fields, fields))) #dummy, to explain what each column means
for resp in resps :
wr.writerow(resp)
return send_from_directory("static", randname, as_attachment = True)
Run Code Online (Sandbox Code Playgroud)
我想在完成下载后删除文件.我该怎么做?
我想在用户下载由 Flask 应用程序创建的文件后删除一个文件。
为此,我在 SO 上找到了这个答案,它没有按预期工作,并引发了一个after_this_request未定义的错误。
因此,我更深入地研究了Flask 的文档,其中提供了有关如何使用该方法的示例片段。因此,我通过定义after_this_request示例代码段中所示的函数来扩展我的代码。
执行代码resp。运行服务器按预期工作。但是,该文件没有被删除,因为@after_this_request没有被调用,这很明显,因为After request ...它没有打印到终端中 Flask 的输出:
#!/usr/bin/env python3
# coding: utf-8
import os
from operator import itemgetter
from flask import Flask, request, redirect, url_for, send_from_directory, g
from werkzeug.utils import secure_filename
UPLOAD_FOLDER = '.'
ALLOWED_EXTENSIONS = set(['csv', 'xlsx', 'xls'])
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
def …Run Code Online (Sandbox Code Playgroud) python ×6
flask ×5
csv ×1
delete-file ×1
download ×1
ffmpeg ×1
mime ×1
python-3.x ×1
request ×1
werkzeug ×1
youtube-dl ×1