Python关于文件/图片上传并在html中显示

1、settings配置

STATIC_URL = '/staticfiles/'
# STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR,'static'),)
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'staticfiles/files')

在我们的项目中创建 staticfiles 文件夹
假如这里文件路径不太懂的,可以看我的文章如何访问静态文件
在这里插入图片描述

2、settings里的urls配置

注意:我是新建app!!
python3 manage.py startapp agent

from django.conf.urls import url,include
from django.contrib import admin
from . import settings
from django.views.static import serve

urlpatterns = [ 
    url(r'^agent/',include('agent.urls')),
    url(r'^staticfiles/(?P<path>.*)$',serve, {'document_root': settings.STATIC_ROOT}),
]

3、views配置(app:agent中的视图函数)

首先是在浏览器地址栏输入 127.0.0.1:8000/agent/upload
然后会有界面出来,然后根据提示上传信息
a_file.name 文件名
a_file.file 文件的字节流数据

from django.shortcuts import render
from django.http import HttpResponse, Http404
from django.http import JsonResponse
from django.conf import settings
import os

def upload(request):
    if request.method == 'GET':
		 return render(request, 'agent/upload.html')
    elif request.method == "POST":
        try:
            # 设置允许上传的文件格式
            ALLOW_EXTENSIONS = ['png', 'jpg', 'jpeg']

            # 接收文件
            a_file = request.FILES['myfile']

            # 判断文件格式
            if a_file.name.split('.')[-1] in ALLOW_EXTENSIONS:

                print("上传文件名是:", a_file.name)   # 文件名
                print('settings.MEDIA_ROOT:', settings.MEDIA_ROOT)  # 文件存放地址(文件夹地址)

                if not os.path.exists(settings.MEDIA_ROOT):
                    os.makedirs(settings.MEDIA_ROOT)
                filename =os.path.join(settings.MEDIA_ROOT, a_file.name)  # 创建文件
                print('filename:',filename)

                img = 'files/'+ a_file.name     # 文件相对路径
                print('img:',img)
                with open(filename, 'wb') as f:
                    data = a_file.file.read() # 文件的字节流数据
                    f.write(data)

                return render(request,'agent/show.html',{"img":img})
            else:
                return HttpResponse("文件格式有误,请上传:png,jpg,jpeg")
        except Exception as e:
            print(e)
    raise Http404

4、urls(app:agent中的路由)

from django.conf.urls import url
from agent import views
urlpatterns = [

    # http://127.0.0.1:8000/agent/upload
    url(r'^upload', views.upload),  # 上传文件
]

5、templates(app:agent中的模板)

注意模板的创建位置
注意模板的创建位置

这个是 upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>
    <h3>上传文件</h3>
    <form method="post" action="/agent/upload" enctype="multipart/form-data">
        <input type="file" name="myfile"/><br>
        <input type="submit" value="上传">
    </form>

</body>
</html>

这个是 show.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>展示图片</title>
</head>
<body>

    {% load static %}
    <h2>不好</h2>
    <img src="{% static img %}">
 
</body>
</html>

最后

然后启动项目就可以运行了~

其他方式:使用postman这个软件

使用这个软件就可以不用写html~
在这里插入图片描述
可能post完,图片没有显示,但是终端请求是正常的~ 终端打印的信息,是我上面视图函数调试打印的
在这里插入图片描述
若哪里不合适,请评论,一起探讨~

附加:

批量上传图片:

首先批量上传是前端将一堆图片转换成一个base64的数组,将数组传给后端,后端对数据进行解析,然后 with open 打开,write写(‘wb’)
或者,直接给后端一个base64数据包,进行解析,写文件~

要么就一次一次post,传图片 ~ 半自动 哈哈哈哈
如果有更好的方法,请评论,一起探讨 ~

上传文件保存在指定文件夹中

from django.shortcuts import render
from django.http import HttpResponse, Http404
from django.http import JsonResponse
from django.conf import settings
import os

def upload(request):
    if request.method == 'GET':
        try:
            return render(request, 'agent/upload.html')
        except Exception as e:
            print(e)
    elif request.method == "POST":
        try:
            # 设置允许上传的文件格式
            ALLOW_EXTENSIONS = ['png', 'jpg', 'jpeg']

            # 接收文件
            a_file = request.FILES['myfile']
            
            # 接收文件夹名字
            a_filename = request.POST['filename']
     
            # 判断文件格式
            if a_file.name.split('.')[-1] in ALLOW_EXTENSIONS:
             	# 判断文件夹是否存在,不存在就创建
                if not os.path.exists("/home/tarena/图片/" + a_filename):
                    os.makedirs("/home/tarena/图片/" + a_filename)

                # 在框架外的别的地方存文件
                with open("/home/tarena/图片/" + a_filename + a_file.name, 'wb') as f:
                    data = a_file.file.read()  # 文件的字节流数据
                    f.write(data)
                return HttpResponse("接收文件:" + a_file.name + "成功")
            else:
                return HttpResponse("文件格式有误,请上传:png,jpg,jpeg")
        except Exception as e:
            print(e)
    raise Http404
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这个问题我可以回答。在 HTML ,可以使用 `<input>` 标签的 `type="file"` 属性来创建一个文件上传控件,并使用 JavaScript 将上传的文件路径显示在页面上。具体步骤如下: 1. 在 HTML ,创建一个文件上传控件: ```html <form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <button type="submit">Upload</button> </form> ``` 这里的 `enctype="multipart/form-data"` 属性是必须的,用于告诉服务器这个表单包含文件上传的内容。 2. 在服务器端,处理文件上传请求,并返回文件路径: ```python @app.route('/upload', methods=['POST']) def upload(): file = request.files['file'] filename = file.filename file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) # 将文件路径返回给客户端 return file_path ``` 这里的 `file_path` 是上传文件保存的路径。 3. 在客户端,使用 JavaScript 发送文件上传请求,并将上传后返回的文件路径显示在页面上: ```html <form> <input type="file" id="file"> <button type="button" onclick="uploadFile()">Upload</button> </form> <p>File path: <span id="file-path"></span></p> <script> function uploadFile() { var fileInput = document.getElementById('file'); var file = fileInput.files[0]; var formData = new FormData(); formData.append('file', file); var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload'); xhr.onload = function() { if (xhr.status === 200) { var filePath = xhr.responseText; document.getElementById('file-path').innerHTML = filePath; } }; xhr.send(formData); } </script> ``` 这里的 `uploadFile()` 函数使用 XMLHttpRequest 对象发送文件上传请求,并在上传完成后将返回的文件路径显示在页面上。 这样,就可以在 HTML 上传文件并在页面上显示文件路径了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值