我已将所有图片存储在 \ uploads 文件夹中。我在文件夹中存储了文件名+扩展名。每张图片的名称都为 PHOTO_ID.jpeg 。我有一些关于项目的问题以及我通过其ID连接照片的项目。我想发送包含图像url的JSON响应。
通缉回复: json:{name: 'somename' url: 'imageURL'}
所以问题是如何获取只能从一个用户访问的网址。我不想让任何人能够猜出其他人的网址形象。 我在FLASK中找到了一些方法,但它们需要绑定到某个端点。我不想要显式端点来检索图像的网址。 到目前为止我发现的这些方法:
send_from_directory(DIRECTORY,FILENAME)
url_for(endpoint, filename=filename)
send_file(FILEPATH,'image/' + extension, as_attachment=True)
我想要像retrieve_url(FILEPATH)
这样简单的东西,它只会为一个用户返回网址和安全方法。
感谢您的帮助。
答案 0 :(得分:0)
我看到了几种方法
1)不要使用可预测的文件名,而是使用一些长的随机字符串保存文件,并将其链接到数据库中的原始文件名
2)为静态图像制作自定义路线,并且只有在验证用户有权访问时才发送图像:
@app.route('/send_file/<path:filename>')
def send_file(filename):
image = Photo.query.filter_by(user_id=session['user_id'], filename=filename).first()
if image:
return send_from_directory('image_folder', filename)
else:
return 'not allowed/found'
3将图像作为二进制数据发送到JSON中(更多数据+不优雅),请参阅here。
答案 1 :(得分:0)
如果您有基于会话的用户管理系统,请创建一个身份验证令牌(任意随机字符串/使用bcrypt根据某些会话信息生成加密令牌)将其存储在您的数据库/会话中。
对于您的图片,请执行以下操作:
@app.route('/downloads/<auth_token>/<filename>')
def downloads(auth_token, filename):
if session['auth_token'] == str(auth_token):
return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
return 'You are not allowed to view this page'
加密的会话令牌对该特定会话的特定用户有效。如果auth_token不匹配,则该URL上将无法访问该文件。