|
|
|
@ -1,8 +1,9 @@ |
|
|
|
|
import os |
|
|
|
|
import mimetypes |
|
|
|
|
|
|
|
|
|
from django.contrib import messages |
|
|
|
|
from django.contrib.auth import authenticate |
|
|
|
|
from django.db.models import F, QuerySet, Count |
|
|
|
|
from django.http import JsonResponse |
|
|
|
|
from django.http import JsonResponse, StreamingHttpResponse, FileResponse |
|
|
|
|
from django.shortcuts import HttpResponse, render, redirect, reverse |
|
|
|
|
from django.contrib.auth.decorators import login_required |
|
|
|
|
from django.views.decorators.cache import cache_page |
|
|
|
@ -11,10 +12,12 @@ from django.conf import settings |
|
|
|
|
from .forms import * |
|
|
|
|
from .models import * |
|
|
|
|
from .qingcloud import putImage |
|
|
|
|
import datetime, requests, json |
|
|
|
|
import datetime, requests, json, re, os |
|
|
|
|
from django.views.decorators.csrf import csrf_exempt |
|
|
|
|
from django.views.decorators.clickjacking import xframe_options_sameorigin |
|
|
|
|
from .csdn import get_image |
|
|
|
|
from wsgiref.util import FileWrapper |
|
|
|
|
from urllib.parse import quote |
|
|
|
|
|
|
|
|
|
#@cache_page(60 * 15) |
|
|
|
|
def index(request): |
|
|
|
@ -276,17 +279,66 @@ def paperDetail(request, id): |
|
|
|
|
paper.objects.filter(id=id).update(views=paper.objects.filter(id=id).get().views+1) |
|
|
|
|
return render(request, 'function/viewmd.html', {'data': data, 'thumbs': thumbs.objects.filter(paper_id=id).count()}) |
|
|
|
|
|
|
|
|
|
def videoView(request): |
|
|
|
|
def videoView(request, id): |
|
|
|
|
if request.method == 'GET': |
|
|
|
|
video_path = request.GET.get('videopath') |
|
|
|
|
return render(request, 'nav/videoview.html', {'path': video_path}) |
|
|
|
|
data = videoUpload.objects.filter(id=id).get() |
|
|
|
|
return render(request, 'nav/videoview.html', {'path': data.video_path}) |
|
|
|
|
|
|
|
|
|
def videoList(request): |
|
|
|
|
desc = videoUpload.objects.all().values('video_desc').distinct() |
|
|
|
|
data = {} |
|
|
|
|
for i in desc: |
|
|
|
|
data[i["video_desc"]] = videoUpload.objects.filter(video_desc=i["video_desc"]).all().order_by('video_title') |
|
|
|
|
for k,v in data.items(): |
|
|
|
|
for i in v.all(): |
|
|
|
|
print(i.video_title) |
|
|
|
|
return render(request, 'nav/videolist.html', {'data':data }) |
|
|
|
|
return render(request, 'nav/videolist.html', {'data':data }) |
|
|
|
|
|
|
|
|
|
def file_iterator(file_name, chunk_size=8192, offset=0, length=None): |
|
|
|
|
with open(file_name, "rb") as f: |
|
|
|
|
f.seek(offset, os.SEEK_SET) |
|
|
|
|
remaining = length |
|
|
|
|
while True: |
|
|
|
|
bytes_length = chunk_size if remaining is None else min(remaining, chunk_size) |
|
|
|
|
data = f.read(bytes_length) |
|
|
|
|
if not data: |
|
|
|
|
break |
|
|
|
|
if remaining: |
|
|
|
|
remaining -= len(data) |
|
|
|
|
yield data |
|
|
|
|
|
|
|
|
|
def stream_video(request): |
|
|
|
|
"""将视频文件以流媒体的方式响应""" |
|
|
|
|
range_header = request.META.get('HTTP_RANGE', '').strip() |
|
|
|
|
range_re = re.compile(r'bytes\s*=\s*(\d+)\s*-\s*(\d*)', re.I) |
|
|
|
|
range_match = range_re.match(range_header) |
|
|
|
|
path = request.GET.get('path') |
|
|
|
|
#这里根据实际情况改变,我的views.py在core文件夹下但是folder_path却只到core的上一层,media也在core文件夹下 |
|
|
|
|
folder_path = os.getcwd().replace('\\', '/') |
|
|
|
|
path=folder_path+path #path就是template ?后面的参数的值 |
|
|
|
|
size = os.path.getsize(path) |
|
|
|
|
content_type, encoding = mimetypes.guess_type(path) |
|
|
|
|
content_type = content_type or 'application/octet-stream' |
|
|
|
|
if range_match: |
|
|
|
|
first_byte, last_byte = range_match.groups() |
|
|
|
|
first_byte = int(first_byte) if first_byte else 0 |
|
|
|
|
last_byte = first_byte + 1024 * 1024 * 10 |
|
|
|
|
if last_byte >= size: |
|
|
|
|
last_byte = size - 1 |
|
|
|
|
length = last_byte - first_byte + 1 |
|
|
|
|
resp = StreamingHttpResponse(file_iterator(path, offset=first_byte, length=length), status=206, content_type=content_type) |
|
|
|
|
resp['Content-Length'] = str(length) |
|
|
|
|
resp['Content-Range'] = 'bytes %s-%s/%s' % (first_byte, last_byte, size) |
|
|
|
|
else: |
|
|
|
|
resp = StreamingHttpResponse(FileWrapper(open(path, 'rb')), content_type=content_type) |
|
|
|
|
resp['Content-Length'] = str(size) |
|
|
|
|
resp['Accept-Ranges'] = 'bytes' |
|
|
|
|
return resp |
|
|
|
|
|
|
|
|
|
def videoDownload(request, id): |
|
|
|
|
data = videoUpload.objects.filter(id=id).get() |
|
|
|
|
file_path = str(data.video_path)[1:] |
|
|
|
|
file_name = os.path.basename(file_path) |
|
|
|
|
file = open(file_path, 'rb') |
|
|
|
|
response = FileResponse(file) |
|
|
|
|
response['Content-Type'] = 'application/octet-stream' |
|
|
|
|
response['Content-Disposition'] = 'attachment;filename="{}"'.format(quote(file_name)) |
|
|
|
|
messages.error(request, '下载成功') |
|
|
|
|
return response |
|
|
|
|