当前位置: 首页 > 知识库问答 >
问题:

在Django中上传后,如何获得文件的绝对路径?

邓仲卿
2023-03-14

我想上传一个文件到我的数据库,上传后导入它,并最终将数据导出到我的数据库。我有上传工作只是罚款,但我不知道如何获得文件的绝对路径后,它被上传。我可以打印出文档的名称,但是如果上传了相同的文档名称,它会被附加,但是如果我调用form.cleaned_data['文档']. name,它仍然显示原始文件名。我能做些什么来获得绝对文件路径,然后调用一个函数来开始处理这个文件?

这就是我想要做的:

  • 用户上传. csv文件
  • 文件保存在db中(带有描述和文件路径。文件路径正在正确存储在db)
  • 获取刚刚上传的文件的文件位置
  • 开始处理此文件以转换. csv数据并存储在数据库中

models.py

from django.db import models

# Create your models here.
class Document(models.Model):
    description = models.CharField(max_length=255, blank=True)
    document = models.FileField(upload_to='documents/')
    uploaded_at = models.DateTimeField(auto_now_add=True)

意见。派克

from django.shortcuts import render, redirect
from django.views import View
# Create your views here.

from .forms import DocumentForm
from .models import Document   

class  FileUpload(View):
    def post(self, request):
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            print()
            print(form.cleaned_data['document'].name)
            form.save()
            return redirect('main_db_model:home')
        else:
            return render(request, 'file_upload_form.html', {
                'form': form
            })

    def get(self, request):
        form = DocumentForm()
        return render(request, 'file_upload_form.html', {
            'form': form
        })

形式。派克

from django import forms
from .models import Document

class DocumentForm(forms.ModelForm):
    class Meta:
        model = Document
        fields = ('description', 'document', )

file_upload_form.html(模板):

{% extends "base.html" %}

{% block content %}
  <form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Upload</button>
  </form>
      {% if saved %}
         <strong>Your profile was saved.</strong>
      {% endif %}
  This is the form page
  <p><a href="{% url 'main_db_model:home' %}">Return to home</a></p>

    <p>Uploaded files:</p>
      <ul>
        {% for obj in documents %}
          <li>
            <a href="{{ obj.document.url }}">{{ obj.document.name }}</a>
            <small>(Uploaded at: {{ obj.uploaded_at }})</small>
            {{ obj.document.url }}
          </li>
        {% endfor %}
      </ul>
{% endblock %}

共有3个答案

淳于功
2023-03-14

我认为上传文件后获取路径更好,下面是使用创建方法的示例(model.objects.create())

models.py

class AuctionPurchase(models.Model):
    file = models.FileField( upload_to='auction_purchase_files/')
    file_name = models.CharField(max_length=255)
    updated = models.DateTimeField(auto_now=True)
    timestamp = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.file_name
    
    class Meta:
        ordering = ["-timestamp", ]

意见。派克

def auction_purchases_upload(request):
    template_name = 'auction_purchases/auction_purchases_upload.html'
    if request.method == 'POST':
        file = request.FILES.get('file')
        file_obj = AuctionPurchase.objects.create(
            file=file,
            file_name = file.name
        )
        file_path = '/media/'+ str(file_obj.file)
        Print(file_path)
        messages.success(request, 'File successfully upload.')
        return redirect('auction_purchases:auction_purchases_upload')
    form = AuctionPurchaseForm()
    return render(request, template_name,{'form':form})

在视图中,我们可以使用创建方法返回创建对象的实例,该实例可以使用模型字段名称进行访问,例如file_obj.file为您提供了保存的相对路径,我必须将其附加到媒体文件夹中以使路径完成,要获得绝对路径,只需执行file_obj.file.path

通博实
2023-03-14

如果您试图从实际的Django窗体保存文件,这些答案效果很好。但是,也许有人(像我一样)从REST API上下文中偶然发现了这个问题。所以,下面是我在django==3.2上处理其他api文件上传帖子请求的情况下的工作原理:

    from django.core.files.storage import FileSystemStorage
    img_file = request.FILES['file']
    
    fs = FileSystemStorage()
    filename = fs.save(img_file.name, img_file)
    uploaded_file_path = fs.path(filename)
    print('absolute file path', uploaded_file_path)    

那么,财政司司长。path(filename)实际上返回我刚刚上传的文件的绝对路径。e、 g:在我的例子中,我的应用程序运行在debian docker容器中,我的媒体目录是/vol/web/media,我得到的输出像/vol/web/media/myfile。这正是我想要的。

孙斌
2023-03-14

以前,我建议您将此上传到class='documents/'更改为上传到class='documents/%Y/%m/%d',为什么?这可以处理文档路径中的大型文档文件。

表单。已清理的_数据['document'](或request.FILES['document'])返回一个UploadedFile对象。当然是表单。已清理的_数据['document']。name应仅返回名称。

class  FileUpload(View):
    def post(self, request):
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            # this `initial_obj` if you need to update before it uploaded.
            # such as `initial_obj.user = request.user` if you has fk to `User`, 
            # if not you can only using `obj = form.save()`
            initial_obj = form.save(commit=False)
            initial_obj.save()

            # return path name from `upload_to='documents/'` in your `models.py` + absolute path of file.
            # eg; `documents/filename.csv`
            print(initial_obj.document)

            # return `MEDIA_URL` + `upload_to` + absolute path of file.
            # eg; `/media/documents/filename.csv`
            print(initial_obj.document.url)

            form.save()

但是如果您使用上传到class='documents/%Y/%m/%d',您将得到不同的结果,

print(initial_obj.document)      # `documents/2017/02/29/filename.csv`

print(initial_obj.document.url)  # `/media/documents/2017/02/29/filename.csv`

 类似资料:
  • 我正试图在我的Android应用程序中导入sky.csv文件。 请帮我做这个。我试过这么多方法。然而,我没有得到任何适当的解决办法。

  • 问题内容: 给定路径,例如,我如何找到相对于Python中当前工作目录的文件的绝对路径?例如在Windows上,我可能会得到以下结果: 问题答案: 如果已经是绝对路径,也可以使用:

  • 问题内容: 作为Django的新手,我很难在Django 1.3中制作上传应用程序。我找不到任何最新的示例/代码段。有人可以发布最少但完整的(模型,视图,模板)示例代码来这样做吗? 问题答案: ew,Django文档确实没有很好的例子。我花了2个多小时来挖掘所有内容,以了解其工作原理。有了这些知识,我实现了一个项目,该项目可以上传文件并将其显示为列表。要下载该项目的源代码,请访问https://g

  • 问题内容: 嗨,我需要使用FileInputStream读取文件,但是我没有获得正确的路径。我的文件位于C:\ Users \ tester \ Documents \ Java Project \ Samples \ ProjectOne \ src \ pdfReader中。但是,当我使用以下代码时,我得到的错误路径是“ / C:/ Users / tester / Documents / J