0

我试图让我的 Django 应用程序的用户通过表单上传电子名片,即时解析这些电子名片,然后将一些内容提供回前端,而不将电子名片存储在服务器上。

我已经成功找到了一种方法,可以使用 vobject 库和几行代码(如下所示)从存储在我的机器上的 vcard 中读取和提取内容

 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']

有什么帮助吗?我尝试了几个小时,无法找出问题所在。

4

1 回答 1

0

这成功了

file = request.FILES["vcard"].read()

vcard_path=file.decode("utf-8")
于 2021-10-01T20:40:17.970 回答