Django 上传和读取 vcard 对象 - 失去理智
Django upload and read vcard object - loosing my mind
我正在尝试让我的 Django 应用程序的用户通过表单上传 vcards,即时解析这些 vcards,然后将一些内容提供回前端而不将 vcards 存储在服务器上。
我已经成功地找到了一种方法来使用 vobject 库和几行代码从存储在我机器上的 vcards 中读取和提取内容,如下所示
with open(vcard_path) as source_file:
for vcard in vobject.readComponents(source_file):
full_name = vcard.contents['fn']
....
但是,在访问通过 django 表单上传的 vcard 文件时,我无法复制这种方法。
我有这个表格
<form action="{% url "action:upload_vcard" %}" method="POST" enctype="multipart/form-data" class="form-horizontal">
{% csrf_token %}
<div class="form-group">
<label for="name" class="col-md-3 col-sm-3 col-xs-12 control-label">File: </label>
<div class="col-md-8">
<input type="file" name="vcard" id="vcard_file" required="True" class="form-control">
</div>
</div>
<div class="form-group">
<div class="col-md-3 col-sm-3 col-xs-12 col-md-offset-3" style="margin-bottom:10px;">
<button class="btn btn-primary"> <span class="glyphicon glyphicon-upload" style="margin-right:5px;"></span>Upload </button>
</div>
</div>
</form>
这是视图
def upload_vcard(request):
data = {}
if "GET" == request.method:
return render(request, "action/upload_test.html", data)
# if not GET, then proceed
file = request.FILES["vcard"]
with open(file) as source_file:
for vcard in vobject.readComponents(source_file):
full_name = vcard.contents['fn']
return HttpResponseRedirect(reverse("action:upload_vcard"))
在这种情况下,我收到 TypeError: expected str, bytes or os.PathLike object, not InMemoryUploadedFile
的错误。我环顾四周,有人建议删除代码的“open()”部分,只考虑文件已经打开。
我尝试通过更改
with open(file) as source_file:
for vcard in vobject.readComponents(source_file):
full_name = vcard.contents['fn']
仅使用以下代码,但我仍然收到错误 TypeError: cannot use a string pattern on a bytes-like object
for vcard in vobject.readComponents(file):
full_name = vcard.contents['fn']
有什么帮助吗?我试了好几个小时也没弄清楚问题所在。
成功了
file = request.FILES["vcard"].read()
vcard_path=file.decode("utf-8")
我正在尝试让我的 Django 应用程序的用户通过表单上传 vcards,即时解析这些 vcards,然后将一些内容提供回前端而不将 vcards 存储在服务器上。
我已经成功地找到了一种方法来使用 vobject 库和几行代码从存储在我机器上的 vcards 中读取和提取内容,如下所示
with open(vcard_path) as source_file:
for vcard in vobject.readComponents(source_file):
full_name = vcard.contents['fn']
....
但是,在访问通过 django 表单上传的 vcard 文件时,我无法复制这种方法。
我有这个表格
<form action="{% url "action:upload_vcard" %}" method="POST" enctype="multipart/form-data" class="form-horizontal">
{% csrf_token %}
<div class="form-group">
<label for="name" class="col-md-3 col-sm-3 col-xs-12 control-label">File: </label>
<div class="col-md-8">
<input type="file" name="vcard" id="vcard_file" required="True" class="form-control">
</div>
</div>
<div class="form-group">
<div class="col-md-3 col-sm-3 col-xs-12 col-md-offset-3" style="margin-bottom:10px;">
<button class="btn btn-primary"> <span class="glyphicon glyphicon-upload" style="margin-right:5px;"></span>Upload </button>
</div>
</div>
</form>
这是视图
def upload_vcard(request):
data = {}
if "GET" == request.method:
return render(request, "action/upload_test.html", data)
# if not GET, then proceed
file = request.FILES["vcard"]
with open(file) as source_file:
for vcard in vobject.readComponents(source_file):
full_name = vcard.contents['fn']
return HttpResponseRedirect(reverse("action:upload_vcard"))
在这种情况下,我收到 TypeError: expected str, bytes or os.PathLike object, not InMemoryUploadedFile
的错误。我环顾四周,有人建议删除代码的“open()”部分,只考虑文件已经打开。
我尝试通过更改
with open(file) as source_file:
for vcard in vobject.readComponents(source_file):
full_name = vcard.contents['fn']
仅使用以下代码,但我仍然收到错误 TypeError: cannot use a string pattern on a bytes-like object
for vcard in vobject.readComponents(file):
full_name = vcard.contents['fn']
有什么帮助吗?我试了好几个小时也没弄清楚问题所在。
成功了
file = request.FILES["vcard"].read()
vcard_path=file.decode("utf-8")