提问人:b.dot 提问时间:11/6/2022 更新时间:11/6/2022 访问量:248
如何在客户端处理上传的文件,而无需使用 Dash/Streamlit/Flask/其他东西将它们上传到服务器?
How to process uploaded files on the client side without uploading them to the server with Dash/Streamlit/Flask/something else?
问:
特别是,我想从上传的图像中提取EXIF数据。
我更喜欢在 Python 中执行此操作,但是我只找到了在 JS 中提取客户端 EXIF 数据的解决方案。这是我找到的JS库:https://github.com/exif-js/exif-js 与Dash客户端回调功能一起在文件上传后运行JS代码:https://dash.plotly.com/clientside-callbacks。
这是我试图让它工作,但是在上传图像后它似乎没有做任何事情:
import dash
from dash import dcc
from dash import html
from dash.dependencies import Input, Output
import plotly.express as px
import pandas as pd
app = dash.Dash(__name__, external_scripts=['https://cdn.jsdelivr.net/npm/exif-js'],)
app.title = "Get exif"
app.layout = html.Div(
[
dcc.Upload(
id='upload-upload_images',
children=html.Div([
'Drag and Drop or ',
html.A('Select Files')
]),
style={
'width': '100%',
'height': '60px',
'lineHeight': '60px',
'borderWidth': '1px',
'borderStyle': 'dashed',
'borderRadius': '5px',
'textAlign': 'center',
'margin': '10px'
},
# Allow multiple files to be uploaded
multiple=True
),
html.Div(id='display_exif'),
]
)
app.clientside_callback(
"""
window.onload=getExif;
function getExif(file_list) {
var img1 = file_list[0];
var my_exif = EXIF.getData(img1, function() {
var make = EXIF.getTag(this, "Make");
var model = EXIF.getTag(this, "Model");
var makeAndModel = document.getElementById("makeAndModel");
makeAndModel.innerHTML = `${make} ${model}`;
});
return my_exif
}
""",
Output('display_exif', 'children'),
Input('upload-data', 'contents'),
)
app.run_server(debug=False)
如果这在 Streamlit 中是可能的,那就太棒了,如果不能,那么在 Dash、Flask 或 Python 中的任何其他方式中。我没有 JS 的经验,所以之后我想将提取的 EXIF 数据放回 Python 中以进一步使用它。
非常感谢任何帮助!
答: 暂无答案
评论