如何在Flask应用程序中提供ezdxf下载?

时间:2019-12-16 20:31:41

标签: dxf ezdxf

我试图将ezdxf实施到Flask Web应用程序中,在那里我尝试呈现文件并将其作为下载提供。

如果没有数据库,有可能吗? (如果没有,如何将saveas函数的文件目录更改为Web数据库?)

感谢Jan

2 个答案:

答案 0 :(得分:0)

您可以通过write方法将DXF文件写入文本流,因此可以使用StringIO对象将DXF文件写入字符串。 StringIO.getvalue()返回一个unicode字符串,如果您的应用需要二进制编码的数据,则必须使用正确的编码将其编码为二进制字符串。

DXF R2007(AC1021)和更高版本的文本编码始终为'utf8',对于较旧的DXF版本,所需的编码存储在Drawing.encoding中。

import io
import ezdxf

def to_binary_data(doc):
    stream = io.StringIO()
    doc.write(stream)
    dxf_data = stream.getvalue()
    stream.close()
    enc = 'utf-8' if doc.dxfversion >= 'AC1021' else doc.encoding
    return dxf_data.encode(enc)

doc = ezdxf.new()
binary_data = to_binary_data(doc)

答案 1 :(得分:0)

更多信息和代码示例将有所帮助。您可以使用html A元素使用户能够从其浏览器下载文件。您必须将A元素的“ href”属性链接为dxf文件的内容。

这也是一个基于ezdxf信息的示例,也是基于以上的莫兹曼信息:

# Export file as string data so it can be transfered to the browser html A element href:
# Create a string io object: An in-memory stream for text I/O
stream_obj = io.StringIO()
# write the doc (ie the dxf file) to the doc stream object
doc.write(stream_obj)
# get the stream object values which returns a string
dxf_text_string = stream_obj.getvalue()
# close stream object as required by good practice
stream_obj.close()

file_data = "data:text/csv;charset=utf-8," + dxf_text_string

,然后将“ file_data”分配给href属性。我使用Dash-Plotly回调,并且可以根据需要为您提供有关如何执行此操作的代码。

或者您也可以在烧瓶路由中使用flask.send_file函数。这要求数据为二进制格式。

# The following code is within a flask routing 
# Create a BytesIO object
 mem = io.BytesIO()
 # Get the stringIO values as string, encode it to utf-8 and write it to the bytes object
# Create a string io object: An in-memory stream for text I/O
stream_obj = io.StringIO()
# write the doc (ie the dxf file) to the doc stream object
doc.write(stream_obj)
# The bytes object file type object is what is required for the flask.send_file method to work
 mem.write(stream_obj.getvalue().encode('utf-8'))
 mem.seek(0)
 # Close StringIO object
 stream_obj.close()

 return flask.send_file(
     mem,
     mimetype='text/csv',
     attachment_filename='drawing.dxf',
     as_attachment=True,
     cache_timeout=0
 )

如果您愿意,我可以为您提供更多信息,但是您可能需要提供一些代码结构,以了解您如何编码和传递数据。谢谢JF