文件的上传和下载功能

1.下载PDF / EXCLE文件

视图函数:

from django.http import HttpRequest, HttpResponse, StreamingHttpResponse
import os
from urllib.parse import quote

def download_pdf(request):
    """打开PDF文件再下载"""
#第一步:构建文件路径(当前路径下+resoure文件夹的Docker入门教程.pdf)
    path = os.path.dirname(os.path.abspath(__file__))
    path = os.path.join(path, 'resources/Docker入门教程.pdf')    

#第二步:打开方式是每次打开1024字节StreamingHttpResponse
file_stream = open(path, 'rb')
file_iter = iter(lambda: file_stream.read(1024), b'')

 #第三步:设置response的文件类型及响应头
    resp = StreamingHttpResponse(file_iter, content_type='application/pdf')
    filename = quote('Docker入门教程.pdf')#如果是中文名,必须处理成百分号编码(quote把中文变为百分号编码)
    resp['content-disposition'] = f'inline; filename="{filename}"'  #设置响应头content-disposition,inline是打开文件,attachment是下载文件
    return resp


def download_excel(request):
    """直接下载Excel文件"""
    path = os.path.dirname(os.path.abspath(__file__))
    path = os.path.join(path, 'resources/老师信息登记表.xlsx')
    
    with open(path, 'rb') as file_stream:
        buffer = file_stream.read()
        
    resp = HttpResponse(buffer, content_type='application/vnd.ms-excel')
    filename = quote('老师信息登记表.xlsx')
    resp['content-disposition'] = f'attachment; filename="{filename}"'
    return resp

模板页:

<a href="/vote/pdf">下载PDF文件</a>&nbsp;&nbsp;
<a href="/vote/excel">下载Excel文件</a>

设置访问路径(vote应用中):

urlpatterns = [
    path('pdf/', views.download_pdf),
    path('excel/', views.download_excel),
]

2.在页面上集成富文本

推荐:wangEditor/kindEditor/CKeditor
不会用,就看使用文档。

(textarea多行文本输入框变为富文本)

  1. 导入Kindeditor到static文件夹
    下载网址:http://kindeditor.net
  2. 模板页
<p>输入内容:
    <textarea cols="30" rows="10" name="content"></textarea>
</p>

<script src="{% static 'js/jquery.min.js' %}"></script>
    <script charset="UTF-8" src="{% static 'js/kindeditor/kindeditor-all-min.js' %}"></script>

    <script>
        let editor = null
        KindEditor.ready(function(K){
            editor = K.create('textarea[name=content]', {
                width:'720px',
                height:'300px',
                uploadJson: '/upload/'
            })
        })
    </script>
  1. 模型
content = models.TextField(null=True)

  1. 设置urls.py
path('upload/', views.upload_picture)
  1. 将上传的文件放到指定路径的文件夹下

步骤:第一步:拿到image_file文件 第二步:创建image_file文件路径 第三步:将image_file文件的数据写入指定的路径path

@csrf_exempt
def upload_picture(request):
    """富文本上传文件"""

    #第一步:拿到image_file文件
    image_file = request.FILES.get('imgFile')  #<MultiValueDict: {'imgFile': [<InMemoryUploadedFile: jay.jpg (image/jpeg)>]}>
    if image_file:#如果不为空

        #第二步:创建image_file文件路径
        ext = os.path.splitext(image_file.name)[-1]  #image_file.name ->'jay.jpg'  ext->'.jpg'
        filename = uuid.uuid1().hex + ext#全局唯一标识符重新生成文件名filename->'9c782cdc757711e99cb10027136a1c48.jpg'
        url = f'/media/{filename}'
        path = os.path.join(settings.MEDIA_ROOT, filename)# '/home/maggie/PycharmProjects/FriendsMoment/media/9c782cdc757711e99cb10027136a1c48.jpg'

        #第三步:将image_file文件的数据写入指定的路径path
        with open(path, 'wb') as file_stream:
            file_stream.write(image_file.read()) 
 #file_stream-> <_io.BufferedWriter name='/home/maggie/PycharmProjects/FriendsMoment/media/9c782cdc757711e99cb10027136a1c48.jpg'>

        data = {'error': 0, 'url': url}
    else:
        data = {'error': 1}
    return JsonResponse(data)

3.上传文件

  1. 视图函数
def saysomething(request):
    """发朋友圈功能"""
    hint = ''
    if request.method == 'POST':
        content = request.POST.get('content', '') #拿到写入的内容
        pic = request.FILES['picture']  #拿到文件名

        username = request.session.get('username', '')  #拿到保存再session中的username并与数据库中的匹配取出除对象
        user = User.objects.filter(username=username).first()

        record = ShareRecord()
        record.content = content
        record.picture = pic
        record.user = user
        record.save()
        hint = '发表成功'
    return render(request, 'saysomething.html', {'hint':hint})
  1. 映射url
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.login),
    path('register/', views.register),
    path('shares/', views.shares),
    path('saysomething/', views.saysomething),
    path('logout/', views.logout),

]+static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

  1. 渲染页面

<body>
    <h2>Friends' Moments</h2>
    <a href="/saysomething/">share something</a>&nbsp&nbsp&nbsp
    {% if request.session.username %}
    {{ request.session.username }}&nbsp&nbsp&nbsp<a href="/logout/">退出登录</a>
    {% endif %}
    <hr>
    {% for share in shares %}
    <dl>
        <dt>
            {{ share.user.username }}
        </dt>
        <dd>{{ share.content }} </dd>
    </dl>
    <div>
        <img src="/media/{{ share.picture }}" height="40" alt="">
    </div>
    {% endfor %}
<button id="load">加载更多</button>
</body>

  1. 指定上传的路径
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容