1. Python

Django-文件上传

一.写在前面

对于一个重量级Web框架,文件上传功能一定是资瓷的非常完善的。本次测试采用两种方式进行。

二.具体步骤

方式一:常规方式

1.首先项目路由urls.py添一条

path('upload1', views.upload1, name='upload1'),

2.路由写好了后就去写视图函数了,打开views.py

# 文件上传测试1
def upload1(requests):
    if requests.method == 'GET':
        return render(requests, 'upload1.html')
    elif requests.method == 'POST':
        file = requests.FILES.get('filename')
        with open("C:/Users/Michael Jiang/Desktop/django_test/mysite/polls/static/uploads/file.jpg","wb") as save_file:
            for chunk in file.chunks():
                save_file.write(chunk)
                save_file.flush()
                
    return HttpResponse("uoload OK!")

这里我把选择文件和上传文件的处理写在一个视图函数里面了,通过requests.method变量来判断请求的类型到底是POST还是GET。

3.如果是GET请求就render一个上传文件的模板给浏览器,模板upload1.html如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Upload1</title>
</head>
<body>
<form action="{% url 'polls:upload1' %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <span>文件:</span>
    <input type="file" name="filename" />
    <button type="submit">上传</button>
</form>
</body>
</html>

通过这个模板可以发现,上传的表单action还是polls:upload1这个视图函数。

不过上传的method是POST 并且指定了enctype="multipart/form-data"即分块传输,这样对于大文件传输成功率会更高。

4.测试

这里我们选择一张图片,然后点击上传!

提示上传成功,那么到底有没有上传成功呢?去对应目录一看便知。

OK,至此常规上传方式已经测试成功;那么既然用了Django这么强大的重量级web框架就是为了用它为我们准备好的各种轮子啊!

所以接下来测试Django方式的上传文件。

方式二:Django方式

1.首先去项目设置setting.py中增加一个媒体路径

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

2.去模型中新建一个User模型models.py

class User(models.Model):
    u_name = models.CharField(max_length=16)
    # upload_to 相对路径 相对与的是MEDIA_ROOT
    u_icon = models.ImageField(upload_to='icons')

记得迁移!!!

3.路由urls.py中添加一条路由

    path('upload2', views.upload2, name='upload2'),

4.编写模板upload2.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Upload2</title>
</head>
<body>
<form action="{% url 'polls:upload2' %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <span>用户名:</span><input type="text" name="username" />
    <br />
    <br />
    <span>头像:</span><input type="file" name="usericon" />
    <br />
    <br />
    <button>提交</button>
</form>
</body>
</html>

5.编写视图函数打开views.py

# 文件上传测试2
def upload2(requests):
    if requests.method == 'GET':
        return render(requests, "upload2.html")
    elif requests.method == 'POST':
        username = requests.POST.get('username')
        usericon = requests.FILES.get('usericon')
        user = User()
        user.u_name = username
        user.u_icon = usericon
        user.save()
        return HttpResponse("创建成功!%d" % user.pk)
    return HttpResponse("有问题!")

OK?测试一下

打开chrome

选择好文件,填好用户名

去文件里查看是否已上传

的确已经成功上传到服务器

接下来去数据库看看文件是怎么存的!

可以看出文件存的是相对路径,那么我要读取用户头像怎么操作呢?请看下面测试

既然读取用户头像,就是说输入用户名然后提交给服务器,服务器收到后查表拿到头像路径,然后返回给模板渲染一下就显示在用户的浏览器中了嗯!

首先去setting.py里面添加如下内容

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

不指定static files dirs的话,后面会报错404

接下来就是写个路由,打开urls.py

    path('showicon', views.showicon, name='showicon'),

写个模板showicon.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ShowICON</title>
</head>
<body>
<img src="{{ usericon }}" />
</body>
</html>

写个视图函数

# 显示用户头像
def showicon(requests):
    username = requests.GET.get('username')
    user = User.objects.get(u_name=username)
    usericon = user.u_icon.url
    usericon = '/static/uploads/' + usericon
    context = {
        'usericon': usericon,
    }
    return render(requests, 'showicon.html', context=context)

这里直接通过GET方式获取用户名

效果图如下:

三.PS

最近在学习MD5消息摘要算法,这个算法是由Rivest 设计的,唉? Rivest???

很熟悉的一个名字嘛,百度后发现他也是RSA公钥算法的设计人之一啊,还是Introduction to Algorithms  这本书的作者之一,难怪这么熟悉。正在学习他在1992写的The MD5 Message-Digest Algorithm

有点复杂,希望到假期结束时能够完成!最后来一张Rivest的靓照!!!

 

额。。。PS一下吧

可还行