Skip to content

Commit

Permalink
No commit message
Browse files Browse the repository at this point in the history
  • Loading branch information
madlee.sjtu committed Oct 19, 2008
1 parent faf7025 commit b2c399a
Show file tree
Hide file tree
Showing 8 changed files with 153 additions and 50 deletions.
2 changes: 1 addition & 1 deletion bbs/uploads/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@
UPLOAD_FILE_FOLDER = r'uploads/%Y/%m/%d' # 用户应该根据自己的实际情况,将此修改为存放上传文件的目录。


MAX_THUMB_NAIL_WIDTH = 250 # 最大的缩略图宽度
MAX_THUMBNAIL_SIZE = 250 # 最大的缩略图宽度
12 changes: 10 additions & 2 deletions bbs/uploads/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class MimeType(models.Model):
magic_number = models.CharField(max_length=20, blank=True, default="") # 魔数,指文件开头的几个固定不变的字节,用于验证上传文件的真实性。

def __unicode__(self):
return self.major + u"/" + self.minor
return self.extname + u": " +self.major + u"/" + self.minor
admin.site.register(MimeType)

class UploadResource(models.Model):
Expand All @@ -27,5 +27,13 @@ class UploadResource(models.Model):
owner = models.ForeignKey(User) # 上传的人
taketime = models.DateTimeField(null=True, blank=True, db_index=True) # 如果用户上传的是照片,记录其拍摄日期
def __unicode__(self):
return self.filename
return unicode(self.filename)
admin.site.register(UploadResource)

class IllegalFileFormat(Exception):
def __init__(self, filename, mimetype):
self.filename = filename
self.mimetype = mimetype

def __unicode__(self):
return unicode(filename) + u" is not a valid " + unicode(mimetype) + u" file!"
93 changes: 61 additions & 32 deletions bbs/uploads/tools.py
Original file line number Diff line number Diff line change
@@ -1,79 +1,108 @@
#!/usr/bin/env python
#coding=utf-8


from uploads.models import *
from uploads.config import UPLOAD_FILE_FOLDER
from uploads.config import MAX_THUMBNAIL_SIZE

from settings import MEDIA_ROOT
from md5 import md5
from cStringIO import StringIO

import os.path
import time
from datetime import datetime
import PIL
import uploads.exif
import Image, ImageDraw # 需要PIL支持

def get_ext_name(fullname):
"""获取文件的扩展名。(不包括.)"""
"""获取文件的扩展名。(不包括.)"""
i = fullname.find('.')
result = ""
if i > -1:
result = fullname[i+1:]
if len(result) > 10:
result = ""
else:
result = result.lower()
return result

def getTakeTime(content):
"""获取照片的拍摄时间"""
def get_take_time(content):
"""获取照片的拍摄时间"""
file = StringIO(content)
tag = exif.process_file(file)
tag = uploads.exif.process_file(file)
file.close()
originalTime = str(tag["EXIF DateTimeOriginal"])
if originalTime == None:
return None
else:
result = "'" + originalTime[0:4] + "/" + originalTime[5:7] + "/" + originalTime[8:] + "'"
print result
result = time.strptime("%Y/%m/%d %H%M%S", result)
return result

def saveFile(user, i):
"""保存上传文件并返回一个UploadResource记录。修改此函数以修改文件的存储过程"""

if originalTime != None:
try:
result = time.strptime(originalTime, "%Y:%m:%d %H:%M:%S")
return datetime(result[0], result[1], result[2], result[3], result[4], result[5])
except ValueError, error:
pass
return None

def save_uploaded_file(user, i):
"""保存上传文件并返回一个UploadResource记录。修改此函数以修改文件的存储过程"""
extname = get_ext_name(i.name)
try:
e.objects.get(extname__exact=extname)
mime = MimeType.objects.get(extname__exact=extname)
except MimeType.DoesNotExist:
mime = MimeType()
mime.extname = extname
mime.minor = extname
mime.save()

content = i.read()
if mime.magic_number != "" and not content.startswith(mime.magic_number):
raise IllegalFileFormat(i.name, mime)

filename = strftime(UPLOAD_FILE_FOLDER)
filename = time.strftime(UPLOAD_FILE_FOLDER)
filename = os.path.join(filename, i.name)
filename = os.path.join(MEDIA_ROOT, folder)
realname = filename[:]

dest = os.path.join(MEDIA_ROOT, filename)

count = 0
while os.path.isdir(realname):
realname = filename[0:-len(extname)] + str(count) + "." + extname

content = i.read()
file = open(filename, "wb")
while os.path.isfile(dest):
count += 1
dest = os.path.join(MEDIA_ROOT, filename[0:-len(extname)] + str(count) + "." + extname)

if count > 0:
filename = filename[0:-len(extname)] + str(count) + "." + extname

file = open(dest, "wb")
file.write(content)
file.close()

result = UploadResource()
result.filename = filename
result.mime = mime
result.owner = user
result.md5code = md5(content).hexdigest()

if mime.major == 'image':
result.taketime = getTakeTime(content)
if mime.major == u'image':
result.taketime = get_take_time(content)

result.save()

return result


def getThumbImage(id, x, y):
def get_thumb_image(id, x, y):
"""获取缩略图"""
x = int(x)
if x > MAX_THUMBNAIL_SIZE:
x = MAX_THUMBNAIL_SIZE

y = int(y)
if y > MAX_THUMBNAIL_SIZE:
y = MAX_THUMBNAIL_SIZE

try:
record = UploadResource.get(id=id)
record.getFile()
except UploadResource.DoesNotExist:
record = UploadResource.objects.get(id=id)
result = Image.open(record.filename.path)
result.thumbnail((x, y), Image.ANTIALIAS)
return result
except Exception, error:
return None

55 changes: 40 additions & 15 deletions bbs/uploads/views.py
Original file line number Diff line number Diff line change
@@ -1,29 +1,27 @@
#!/usr/bin/env python
#coding=utf-8

# Create your views here.

from django.shortcuts import render_to_response
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, HttpResponseNotFound
from django.contrib.auth.models import User
from django.core.paginator import Paginator

from uploads.models import *

from cStringIO import StringIO

import Image, ImageDraw # 需要PIL支持
import uploads.tools

@login_required
def upload(request):
data = {'request':request, 'user':user}
if len(HttpRequest.FILES) == 0:
data = {'request':request, 'user':request.user}
if len(request.FILES) == 0:
return render_to_response('uploads/upload.html', data)
else:
result = []
for i in request.FILES:
result.append(saveFile(request.user, i))
for i in request.FILES.keys():
file = uploads.tools.save_uploaded_file(request.user, request.FILES[i])
assert (file != None)
result.append(file)
data['files'] = result
return render_to_response('uploads/upload_report.html', data)

Expand Down Expand Up @@ -55,16 +53,43 @@ def list_by_user(request, id):


def get_gif_thumbnail(request, id, x, y):
# TODO
pass
img = uploads.tools.get_thumb_image(id, x, y)
if img == None:
return HttpResponseNotFound()
else:
buf = StringIO()
img.save(buf, "GIF")
del img
result = HttpResponse(mimetype="image/gif")
result.write(buf.getvalue())
del buf
return result

def get_png_thumbnail(request, id, x, y):
# TODO
pass
img = uploads.tools.get_thumb_image(id, x, y)
if img == None:
return HttpResponseNotFound()
else:
buf = StringIO()
img.save(buf, "PNG")
del img
result = HttpResponse(mimetype="image/png")
result.write(buf.getvalue())
del buf
return result

def get_jpg_thumbnail(request, id, x, y):
# TODO
pass
img = uploads.tools.get_thumb_image(id, x, y)
if img == None:
return HttpResponseNotFound()
else:
buf = StringIO()
img.save(buf, "JPEG")
del img
result = HttpResponse(mimetype="image/jpeg")
result.write(buf.getvalue())
del buf
return result

def get_photo(request, id, x, y):
# TODO
Expand Down
4 changes: 4 additions & 0 deletions bbs/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@

(r'^accounts/', include('accounts.urls')),
(r'^uploads/', include('uploads.urls')),

(r'^media/', include('uploads.urls')),
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': r'..\templates\media'}),

# (r'^addresses/(.*)', include('addresses.urls')),
# (r'^news/(.*)', include('accounts.newsurls')),
# (r'^forum/(.*)', include('articles.bbsurls')),
Expand Down
1 change: 1 addition & 0 deletions templates/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<title>index</title>
18 changes: 18 additions & 0 deletions templates/uploads/upload.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Upload</title>
</head>

<body>
<form action="" method="post" enctype="multipart/form-data" name="form1" target="." id="form1">
<label>
<input type="file" name="file" />
</label>
<label>
<input type="submit" name="Submit" value="Submit" />
</label>
</form>
</body>
</html>
18 changes: 18 additions & 0 deletions templates/uploads/upload_report.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>上传文件</title>
</head>

<body>
<p>{{ user.username }}
刚刚上传了 如下文件:</p>
<p>{% for i in files %}</p>
<ul>
<li><a href="{{ i.filename.url }}">{{ i.filename.name }} </a>,是一个{{ i.mime }} 文件,共{{ i.filename.size }}字节</li>
</ul>
<p>{% endfor %}</p>
<p>&nbsp;</p>
</body>
</html>

0 comments on commit b2c399a

Please sign in to comment.