基于Python的文件上传代码 + html页面

本文介绍了如何使用Python的HTTPServer和BaseHTTPRequestHandler创建一个简单的服务器,支持GET和POST请求,包括文件上传功能以及目录浏览。index.html页面展示了HTML表单用于上传文件,通过AJAX发送POST请求到服务器。
摘要由CSDN通过智能技术生成

编写服务端server.py代码:

from http.server import HTTPServer, BaseHTTPRequestHandler
import os
import urllib
from http import HTTPStatus

# ip, port config
host = ('127.0.0.1', 8888)

class Resquest(BaseHTTPRequestHandler):
   def do_GET(self):
       print(self.path)
       if self.path == '/':
           self.send_response(200)
           self.end_headers()
           f = open("index.html",'r',encoding='utf-8')
           content = f.read()
           content = content.replace(
               '</body>', self.get_directory('.') + '</body>')
           # 里面需要传入二进制数据,用encode()函数转换为二进制数据
           self.wfile.write(content.encode())
       else:
           try:
               path = urllib.parse.unquote(self.path[1:])
               f = open(path, 'rb')
               self.send_response(200)
               self.end_headers()
               self.wfile.write(f.read())
           except FileNotFoundError:
               self.send_response(404)
               self.end_headers()
               self.wfile.write(b'<h1>File Not Found</h1>')

   def do_POST(self):
       self.send_response(200)
       self.end_headers()

       self.parse_query()
       remainbytes = int(self.headers['content-length'])

       fileName = self.queries['fileName'][0]
       if not fileName:
           print("fail to find fn")
           return (False, "Can't find out file name...")

       print(fileName)
       try:
           out = open(fileName, 'wb')
       except IOError:
           return (False, "Can't create file to write, do you have permission to write?")

       out.write(self.rfile.read(remainbytes))
       print('finish')
       out.close()

   def parse_query(self):
       self.queryString = urllib.parse.unquote(self.path.split('?', 1)[1])
       self.queries = urllib.parse.parse_qs(self.queryString)
       print(self.queries)

   def get_directory(self, path) -> str:
       try:
           list = os.listdir(path)
       except OSError:
           self.send_error(
               HTTPStatus.NOT_FOUND,
               "No permission to list directory")
           return None
       list.sort(key=lambda a: a.lower())
       r = []
       displaypath = os.path.abspath(path)
       title = 'Directory listing for %s' % displaypath
       r.append('<h1>%s</h1>' % title)

       for name in list:
           fullname = os.path.join(path, name)
           displayname = linkname = name
           # Append / for directories or @ for symbolic links
           if os.path.isdir(fullname):
               displayname = name + "/"
               linkname = name + "/"
           if os.path.islink(fullname):
               displayname = name + "@"
               # Note: a link to a directory displays with @ and links with /
           r.append('<li><a href="%s">%s</a></li>' % (linkname, displayname))
       # print(''.join(r))
       return ''.join(r)


if __name__ == '__main__':
   server = HTTPServer(host, Resquest)
   print("Starting server, listen at: %s:%s" % host)
   server.serve_forever()

编写index.html页面:

<!DOCTYPE html>
<html>
<head>
   <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.6.0.js" type="text/javascript"></script>
   <!-- <script src="./jquery-3.6.0.js" type="text/javascript"></script> -->
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>

<body>
   <form id="uploadForm" action="/upload" enctype="multipart/form-data" method="post" onsubmit="return submitFile()">
       <div><input type="file" name="file" multiple></div>
       <br>
       <div><input type="submit" value="提交"> </div>
   </form>
   <script>
       function submitFile() {
           // formData = new FormData($('#uploadForm')[0])
           files = $('#uploadForm')[0].file.files
           for (i = 0; i < files.length; i++) {
               $.ajax({
                   url: "/upload?fileName=" + encodeURIComponent(files[i].name),
                   type: "POST",
                   data: files[i],
                   success: function (data) {
                       console.info("success", data);
                       alert("上传成功!")
                       //document.referrer 前一个页面的URL  返回并刷新页面
                       location.replace(document.referrer);
                   },
                   error: function (data) {
                       console.warn("fail", data);
                   },
                   processData: false,
                   contentType: "multipart/form-data",
                   // contentType: "application/octet-stream"
               });
           }
           return false;
       }
   </script>
</body>
</html>

运行效果:

提交后:

  感谢大家的阅读,觉得有所帮助的朋友点点赞!

  • 35
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
开发一个完整的BBS论坛需要涉及到多个方面,包括前端页面设计、后端服务器搭建、数据库设计、用户登录注册、帖子发布、评论回复等功能实现。下面是一些可能会用到的技术和工具: 前端HTML、CSS、JavaScript、jQuery、Bootstrap等; 后端:Python、Django框架、MySQL数据库、Nginx服务器等。 以下是一些大致的步骤和代码示例供参考: 1. 创建Django项目 在终端中创建一个Django项目,命名为bbs。 ``` $ django-admin startproject bbs ``` 2. 创建Django应用 在bbs项目中创建一个名为posts的应用,用于处理帖子相关的逻辑。 ``` $ python manage.py startapp posts ``` 3. 创建数据库模型 在posts应用下的models.py文件中定义帖子、评论等数据库模型。 ```python from django.db import models from django.contrib.auth.models import User class Post(models.Model): title = models.CharField(max_length=100) content = models.TextField() author = models.ForeignKey(User, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.title class Comment(models.Model): content = models.TextField() author = models.ForeignKey(User, on_delete=models.CASCADE) post = models.ForeignKey(Post, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.content[:20] ``` 4. 创建视图函数 在posts应用下的views.py文件中定义视图函数,用于处理请求并返回响应。 ```python from django.shortcuts import render, redirect from .models import Post, Comment from django.contrib.auth.decorators import login_required def index(request): posts = Post.objects.all().order_by('-created_at') return render(request, 'posts/index.html', {'posts': posts}) @login_required def create_post(request): if request.method == 'POST': title = request.POST['title'] content = request.POST['content'] post = Post.objects.create(title=title, content=content, author=request.user) return redirect('posts:index') return render(request, 'posts/create_post.html') @login_required def create_comment(request, post_id): if request.method == 'POST': content = request.POST['content'] post = Post.objects.get(id=post_id) comment = Comment.objects.create(content=content, author=request.user, post=post) return redirect('posts:index') return render(request, 'posts/create_comment.html', {'post_id': post_id}) ``` 5. 创建模板文件 在bbs项目下的templates文件夹中创建HTML模板文件,用于渲染页面。 index.html: ```html {% extends 'base.html' %} {% block content %} <h1>BBS</h1> <a href="{% url 'posts:create_post' %}" class="btn btn-primary">发布帖子</a> <hr> {% for post in posts %} <h2>{{ post.title }}</h2> <p>{{ post.content }}</p> <p>作者:{{ post.author.username }}</p> <p>发布时间:{{ post.created_at }}</p> <h4>评论:</h4> {% for comment in post.comment_set.all %} <p>{{ comment.content }}</p> <p>评论人:{{ comment.author.username }}</p> <p>评论时间:{{ comment.created_at }}</p> {% empty %} <p>暂无评论</p> {% endfor %} <a href="{% url 'posts:create_comment' post.id %}" class="btn btn-primary">发表评论</a> <hr> {% empty %} <p>暂无帖子</p> {% endfor %} {% endblock %} ``` create_post.html: ```html {% extends 'base.html' %} {% block content %} <h1>发布帖子</h1> <form method="post"> {% csrf_token %} <div class="form-group"> <label for="title">标题</label> <input type="text" class="form-control" id="title" name="title"> </div> <div class="form-group"> <label for="content">内容</label> <textarea class="form-control" id="content" name="content"></textarea> </div> <button type="submit" class="btn btn-primary">发布</button> </form> {% endblock %} ``` create_comment.html: ```html {% extends 'base.html' %} {% block content %} <h1>发表评论</h1> <form method="post"> {% csrf_token %} <div class="form-group"> <label for="content">内容</label> <textarea class="form-control" id="content" name="content"></textarea> </div> <button type="submit" class="btn btn-primary">发表</button> </form> {% endblock %} ``` base.html: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %}BBS{% endblock %}</title> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0/css/bootstrap.min.css"> </head> <body> <div class="container"> {% block content %}{% endblock %} </div> <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> <script src="https://cdn.bootcss.com/bootstrap/4.0.0/js/bootstrap.min.js"></script> </body> </html> ``` 6. 配置URL路由 在bbs项目下的urls.py文件中配置URL路由,将请求映射到相应的视图函数。 ```python from django.contrib import admin from django.urls import path, include from django.conf.urls.static import static from django.conf import settings urlpatterns = [ path('admin/', admin.site.urls), path('', include('posts.urls')), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) ``` 在posts应用下的urls.py文件中定义URL路由。 ```python from django.urls import path from . import views app_name = 'posts' urlpatterns = [ path('', views.index, name='index'), path('create_post/', views.create_post, name='create_post'), path('create_comment/<int:post_id>/', views.create_comment, name='create_comment'), ] ``` 7. 创建超级用户 在终端中创建一个超级用户,以便登录后台管理界面。 ``` $ python manage.py createsuperuser ``` 8. 启动服务器 在终端中启动Django服务器,访问http://localhost:8000/即可查看效果。 ``` $ python manage.py runserver ``` 以上是BBS论坛的开发大致步骤和示例代码。由于BBS论坛的功能较为复杂,具体开发过程中还需要考虑更多细节问题,如用户权限管理、图片上传等。希望能对您有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蜜蜂vs码农

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值