django 实现文件上传并保存

html超链接直接下载不再网页中打开,在a标签里添加 download=””,””里面的内容可随意写,比如文件名

<a href="/download/下载.pdf" download="">下载.pdfa>
from django.db import models

class UploadFile(models.Model):
    title = models.CharField(verbose_name="图片标题", max_length=50)
    path = models.FileField(upload_to='files/')
from django.shortcuts import render, HttpResponse
from .models import UploadFile

def upload_file(request):
    if request.method == "POST":
        up_file = request.FILES.get('upload_file')
        UploadFile(title=up_file.name, path=up_file).save()
        return HttpResponse('success')
    else:
        return render(request, "blog/upload_file.html")
  • enctype="multipart/form-data"
  • name="upload_file"request.FILES.get('upload_file') 名字对应
    <form action="{% url "upload_file" %}" role="form" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <div class="form-group text-center">
            <label for="inputfile" class="col-md-2">上传文件</label>
            <div class="col-md-10">
                <input name="upload_file" type="file" id="inputfile">
            </div>
        </div>
        <div style="clear: both"></div>
        <p style="margin-top: 100px"><button type="submit" class="col-sm-offset-2 btn btn-primary">提交文件 </button></p>
    </form>
  • 指定上传文件的保存路径的根目录
    [En]

    specify the root directory of the save path for uploaded files*

MEDIA_ROOT = os.path.join(BASE_DIR, 'upload')
from django.urls import pathfrom . import viewsurlpatterns = [    path('uploadfile/', views.upload_file, name="upload_file"),]

实现保存的文件与 request 内容相关

def upload_file(request):
    if request.method == "POST":
        up_file = request.FILES.get('upload_file')
        UploadFile(title=up_file.name, path=up_file).save(request=request)
        return HttpResponse('success')
    else:
        return render(request, "blog/upload_file.html")

函数默认会传入

  • instanceUploadFile 实例
  • filename 为文件名
from django.db import models

def upload_path(instance, filename):
    print(instance.rq)
    print(filename)
    return "files/"

class UploadFile(models.Model):
    title = models.CharField(verbose_name="图片标题", max_length=50)
    path = models.FileField(upload_to=upload_path)
    rq = None

    def save(self, *args, **kwargs):
        UploadFile.rq = kwargs.pop("request")
        print(UploadFile.rq)
        super().save(*args, **kwargs)
  • 对模型添加设置与获取 request 的方法
from django.shortcuts import render, HttpResponse
from .models import UploadFile

def upload_file(request):
    if request.method == "POST":
        up_file = request.FILES.get('upload_file')
        f = UploadFile(title=up_file.name, path=up_file)
        f.set_request(request)
        f.save()
        return HttpResponse('success')
    else:
        return render(request, "blog/upload_file.html")
from django.db import models

def upload_path(instance, filename):
    print(instance.get_request().method)
    print(filename)
    return "files/"

class UploadFile(models.Model):
    title = models.CharField(verbose_name="图片标题", max_length=50)
    path = models.FileField(upload_to=upload_path)

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

    def set_request(self, request):
        self.request = request

    def get_request(self):
        return self.request
STATIC_URL = '/static/'
STATICFILES_DIRS = [
   os.path.join(BASE_DIR, 'static'),
   MEDIA_ROOT = os.path.join(BASE_DIR, 'upload')
]
MEDIA_ROOT = os.path.join(BASE_DIR, 'upload')

下载界面

    {% for file_obj in file_list %}
    <div class="row">
        <a href="/upload/{{ file_obj.path }}">{{ file_obj.title }}</a>
    </div>
    {% endfor %}
  • 保存到 media 目录,需要配置路由, path 会自动传入 serve 作为参数
from django.conf.urls import url
from django.urls import path
from django.views.static import serve

urlpatterns = [
    url(r'^media/(?P.*)', serve, {"document_root": settings.MEDIA_ROOT}),
]
  • 保存到 media 目录
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

settings.py

STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'upload')

STATICFILES_DIRS = [
   os.path.join(BASE_DIR, 'static'),
   os.path.join(BASE_DIR, 'upload')
]

urls.py

from django.urls import path
from . import views

urlpatterns = [

    path('uploadfile/', views.upload_file, name="upload_file"),

]

views.py

def upload_file(request):
    if request.method == "POST":
        up_file = request.FILES.get('upload_file')
        UploadFile(title=up_file.name, path=up_file).save(request=request)
        return HttpResponse('success')
    else:
        return render(request, "blog/upload_file.html")

models.py

class UploadFile(models.Model):
    title = models.CharField(verbose_name="图片标题", max_length=50)
    path = models.FileField(upload_to='attach_file/')

upload_file.html

    <form action="{% url "upload_file" %}" role="form" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <div class="form-group text-center">
            <label for="inputfile" class="col-md-2">上传文件</label>
            <div class="col-md-10">
                <input name="upload_file" type="file" id="inputfile">
            </div>
        </div>
        <div style="clear: both"></div>
        <p style="margin-top: 100px"><button type="submit" class="col-sm-offset-2 btn btn-primary">提交文件 </button></p>
    </form>

下载,直接在静态文件目录下查找对应文件,需要加入 STATICFILES_DIRS

<a style="color: #fff;" href="/static/{{ attach.file }}" download="{{ attach.title }}">下载</a>

Original: https://blog.csdn.net/sky0Lan/article/details/120550016
Author: sky0Lan
Title: django 实现文件上传并保存



相关阅读

Title: Linux环境使用Docker手工部署Flask项目

网上大部分关于Docker部署Flask项目的教程,都没告知需要在Linux环境下部署,所以会导致整个教程看下来,在windows系统实操,都是失败的。
第一步,在自己的windows系统安装个linux虚拟机。(具体教程自行网上搜索)
第二步,在linux系统安装docker
Centos安装docker的教程:Linux CentOS安装docker
Debian安装docker的教程:Debian Docker 安装
第三步,将本地创建的flask项目上传到linux,建议先在windows环境下运行,看看跑的通不。项目创建参考:
Flask搭建登录注册项目(全网最详细教程)

我是在linux下新建了一个flask01的文件夹,再把我在windows的项目内容复制过去。项目内容有:

django 实现文件上传并保存
关于Dockerfile文件,内容如下:

FROM python:3.9.2

WORKDIR /app

COPY requirements.txt requirements.txt

RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

COPY . .

CMD ["gunicorn", "app:app", "-c", "./gunicorn.conf.py"]

解读下Dockerfile:

FROM python:3.9.2

①第一行的版本号,是linux下python的版本号,可以通过linux命令python – version查询获取。如果找不到,那么要先安装python包,安装教程自行查找。我查到我安装的版本号是3.9.2

 CMD ["gunicorn", "app:app", "-c", "./gunicorn.conf.py"]

②最后一行的第一个app,是你项目的启动文件名,因为我的启动文件是app.py,所以这里就是app,如果你是其他名字,如start.py,那么这里就应该是”start:app”。第二个app表示创建的flask对象。

gunicorn.conf.py的内容如下。注意,这里我把端口设置为80

workers = 5
worker_class = "gevent"
bind = "0.0.0.0:80"

requirements.txt的内容如下。这个文件的意思就是你这个项目要导入的包。最开始照搬其他博主的,忘记根据自己的项目情况来,没有导入项目需要的pymysql,导致报错了。

gunicorn
gevent
flask
pymysql

我们要保证项目跑起来,要在linux下安装flask、gunicorn 、geven。安装又依靠pip,所以要先安装pip(linux安装pip的方式自行百度),再安装对应的包,我的系统安装的是pip3,所以命令如下:

pip3 install flask
pip3 install gunicorn
pip3 install gevent

3个包安装下来,gevent这个包会报错。可以参考这个教程修正:
pip install gevent 安装失败的解决办法

第四步,在linux运行下我们的启动文件,因为我安装的是python3,命令如下:

python3 app.py

终端出现这个界面,一般就是运行成功了,可以在linux的浏览器输入这个地址看看效果

django 实现文件上传并保存
第五步,通过gunicorn启动flask服务,输入命令:
gunicorn app:app -c gunicorn.conf.py

终端出现这个界面,一般就是运行成功了,可以在linux的浏览器输入这个地址看看效果

django 实现文件上传并保存

第六步,创建镜像

docker build -t 'zhuzhu' .

zhuzhu是镜像名,注意后面有个空格和.

验证下是否创建成功,用以下命令查看镜像:

docker images

第七步,启动容器运行docker镜像(80是前面gunicorn.conf.py设置的端口号)

docker run -d -p 3000:80 zhuzhu

第八步,推送到镜像仓库,如harbor
第九步,部署到服务器,如Rancher

另外,附上docker常用的命令

列出所有的容器,可查询到容器id
docker ps -a
停止运行中的容器
docker stop CONTAINER ID
删除容器
docker rm container_id
删除镜像
docker rmi image_id

Original: https://blog.csdn.net/lala_yanzi/article/details/123840622
Author: 林家小猪
Title: Linux环境使用Docker手工部署Flask项目

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/307870/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总