1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-14 14:21:23 +00:00

Added viewing file size limit

This commit is contained in:
zhengxie
2013-03-25 16:22:10 +08:00
parent 97c10bc6f6
commit b3687748df
8 changed files with 84 additions and 58 deletions

View File

@@ -145,7 +145,7 @@ AUTHENTICATION_BACKENDS = (
ACCOUNT_ACTIVATION_DAYS = 7 ACCOUNT_ACTIVATION_DAYS = 7
# File preview # File preview
FILE_PREVIEW_MAX_SIZE = 10 * 1024 * 1024 FILE_PREVIEW_MAX_SIZE = 30 * 1024 * 1024
USE_PDFJS = True USE_PDFJS = True
FILE_ENCODING_LIST = ['auto', 'utf-8', 'gbk', 'ISO-8859-1', 'ISO-8859-5'] FILE_ENCODING_LIST = ['auto', 'utf-8', 'gbk', 'ISO-8859-1', 'ISO-8859-5']
FILE_ENCODING_TRY_LIST = ['utf-8', 'gbk'] FILE_ENCODING_TRY_LIST = ['utf-8', 'gbk']

View File

@@ -1,14 +1,18 @@
{% extends 'view_file_base.html' %} {% extends 'view_file_base.html' %}
{% block extra_style %}{{block.super}} {% block extra_style %}{{block.super}}
{% if not err%}
<link rel="stylesheet" href="{{MEDIA_URL}}css/mediaelementplayer.css" /> <link rel="stylesheet" href="{{MEDIA_URL}}css/mediaelementplayer.css" />
{% endif %}
{% endblock %} {% endblock %}
{% block extra_script %}{{ block.super }} {% block extra_script %}{{ block.super }}
{% if not err%}
<script src="{{MEDIA_URL}}js/mediaelement-and-player.min.js"></script> <script src="{{MEDIA_URL}}js/mediaelement-and-player.min.js"></script>
<script type="text/javascript"> <script type="text/javascript">
$('#file-view').html('<div class="audio-container"><audio src="{{raw_path}}" width="500" height="30"></audio></div>'); $('#file-view').html('<div class="audio-container"><audio src="{{raw_path}}" width="500" height="30"></audio></div>');
$('audio').mediaelementplayer(/* Options */); $('audio').mediaelementplayer(/* Options */);
</script> </script>
{% endif %}
{% endblock %} {% endblock %}

View File

@@ -77,7 +77,15 @@
<button data="{{ SITE_ROOT }}repo/{{ repo.id }}/{{ obj_id }}/?file_name={{ filename }}&op=download" id="download">{% trans "Download"%}</button> <button data="{{ SITE_ROOT }}repo/{{ repo.id }}/{{ obj_id }}/?file_name={{ filename }}&op=download" id="download">{% trans "Download"%}</button>
</div> </div>
<div id="file-view"> {% block file_view %}{% endblock %} </div> <div id="file-view">
{% if err %}
<div id="file-view-tip">
<p class="error">{{ err }}</p>
</div>
{% else %}
{% block file_view %}{% endblock %}
{% endif %}
</div>
</div> </div>
<form id="link-send-form" action="" method="post" class="hide"> <form id="link-send-form" action="" method="post" class="hide">

View File

@@ -2,6 +2,7 @@
{% load i18n%} {% load i18n%}
{% block extra_script %}{{ block.super }} {% block extra_script %}{{ block.super }}
{% if not err%}
<script type="text/javascript" src="{{MEDIA_URL}}flexpaper/js/flexpaper_flash.js"></script> <script type="text/javascript" src="{{MEDIA_URL}}flexpaper/js/flexpaper_flash.js"></script>
<script type="text/javascript"> <script type="text/javascript">
$('#file-view').html('<div id="flash"></div>'); $('#file-view').html('<div id="flash"></div>');
@@ -66,4 +67,5 @@
check_status(); check_status();
{% endif %} {% endif %}
</script> </script>
{% endif %}
{% endblock %} {% endblock %}

View File

@@ -2,6 +2,7 @@
{% load i18n %} {% load i18n %}
{% block extra_script %}{{ block.super }} {% block extra_script %}{{ block.super }}
{% if not err %}
{% if use_pdfjs %} {% if use_pdfjs %}
<script type="text/javascript" src="{{MEDIA_URL}}js/pdf.js"></script> <script type="text/javascript" src="{{MEDIA_URL}}js/pdf.js"></script>
<script type="text/javascript"> <script type="text/javascript">
@@ -123,4 +124,5 @@ if (!($.browser.msie && parseInt($.browser.version) < 10)) {
{% endif %} {% endif %}
</script> </script>
{% endif %} {% endif %}
{% endif %}
{% endblock %} {% endblock %}

View File

@@ -21,13 +21,7 @@
</div> </div>
{% endif %} {% endif %}
{% if not err %} {% ifnotequal file_content None %}
{% ifnotequal file_content None %} <div id="sf" class="article">{{ file_content|safe }}</div>
<div id="sf" class="article">{{ file_content|safe }}</div> {% endifnotequal %}
{% endifnotequal %}
{% else %}
<div id="file-view-tip">
<p class="error">{{ err }}</p>
</div>
{% endif %}
{% endblock %} {% endblock %}

View File

@@ -1,13 +1,17 @@
{% extends 'view_file_base.html' %} {% extends 'view_file_base.html' %}
{% block extra_style %}{{block.super}} {% block extra_style %}{{block.super}}
{% if not err%}
<link rel="stylesheet" href="{{MEDIA_URL}}css/mediaelementplayer.css" /> <link rel="stylesheet" href="{{MEDIA_URL}}css/mediaelementplayer.css" />
{% endif %}
{% endblock %} {% endblock %}
{% block extra_script %}{{ block.super }} {% block extra_script %}{{ block.super }}
{% if not err%}
<script src="{{MEDIA_URL}}js/mediaelement-and-player.min.js"></script> <script src="{{MEDIA_URL}}js/mediaelement-and-player.min.js"></script>
<script type="text/javascript"> <script type="text/javascript">
$('#file-view').html('<div class="video-container"><video src="{{raw_path}}" width="800" height="400"></video></div>'); $('#file-view').html('<div class="video-container"><video src="{{raw_path}}" width="800" height="400"></video></div>');
$('video').mediaelementplayer(/* Options */); $('video').mediaelementplayer(/* Options */);
</script> </script>
{% endif %}
{% endblock %} {% endblock %}

View File

@@ -21,7 +21,7 @@ from django.utils.hashcompat import md5_constructor
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from seaserv import list_dir_by_path, get_repo, web_get_access_token, \ from seaserv import list_dir_by_path, get_repo, web_get_access_token, \
get_commits, is_passwd_set, check_permission, get_shared_groups_by_repo,\ get_commits, is_passwd_set, check_permission, get_shared_groups_by_repo,\
is_group_user, get_file_id_by_path, get_commit is_group_user, get_file_id_by_path, get_commit, get_file_size
from pysearpc import SearpcError from pysearpc import SearpcError
from base.decorators import ctx_switch_required, repo_passwd_set_required from base.decorators import ctx_switch_required, repo_passwd_set_required
@@ -94,11 +94,7 @@ def repo_file_get(raw_path, file_enc):
try: try:
file_response = urllib2.urlopen(raw_path) file_response = urllib2.urlopen(raw_path)
if long(file_response.headers['Content-Length']) > FILE_PREVIEW_MAX_SIZE: content = file_response.read()
err = _(u'File size surpasses 10M, can not be previewed online.')
return err, '', None
else:
content = file_response.read()
except urllib2.HTTPError, e: except urllib2.HTTPError, e:
err = _(u'HTTPError: failed to open file online') err = _(u'HTTPError: failed to open file online')
return err, '', None return err, '', None
@@ -248,41 +244,49 @@ def view_file(request, repo_id):
# get file type and extension # get file type and extension
filetype, fileext = get_file_type_and_ext(u_filename) filetype, fileext = get_file_type_and_ext(u_filename)
"""Choose different approach when dealing with different type of file."""
img_prev = None img_prev = None
img_next = None img_next = None
ret_dict = {'err': '', 'file_content': '', 'encoding': '', 'file_enc': '', ret_dict = {'err': '', 'file_content': '', 'encoding': '', 'file_enc': '',
'file_encoding_list': [], 'swf_exists': False, 'file_encoding_list': [], 'swf_exists': False,
'filetype': filetype} 'filetype': filetype}
if is_textual_file(file_type=filetype): # Check file size
handle_textual_file(request, filetype, raw_path, ret_dict) fsize = get_file_size(obj_id)
elif filetype == 'Document': if fsize > FILE_PREVIEW_MAX_SIZE:
handle_document(raw_path, obj_id, fileext, ret_dict) from django.template.defaultfilters import filesizeformat
elif filetype == 'PDF': err = _(u'File size surpasses %s, can not be opened online.') % \
handle_pdf(raw_path, obj_id, fileext, ret_dict) filesizeformat(FILE_PREVIEW_MAX_SIZE)
elif filetype == 'Image': ret_dict['err'] = err
parent_dir = os.path.dirname(path)
dirs = list_dir_by_path(current_commit.id, parent_dir)
if not dirs:
raise Http404
img_list = []
for dirent in dirs:
if not stat.S_ISDIR(dirent.props.mode):
fltype, flext = get_file_type_and_ext(dirent.obj_name)
if fltype == 'Image':
img_list.append(dirent.obj_name)
if len(img_list) > 1:
img_list.sort(lambda x, y : cmp(x.lower(), y.lower()))
cur_img_index = img_list.index(u_filename)
if cur_img_index != 0:
img_prev = os.path.join(parent_dir, img_list[cur_img_index - 1])
if cur_img_index != len(img_list) - 1:
img_next = os.path.join(parent_dir, img_list[cur_img_index + 1])
else: else:
pass """Choose different approach when dealing with different type of file."""
if is_textual_file(file_type=filetype):
handle_textual_file(request, filetype, raw_path, ret_dict)
elif filetype == 'Document':
handle_document(raw_path, obj_id, fileext, ret_dict)
elif filetype == 'PDF':
handle_pdf(raw_path, obj_id, fileext, ret_dict)
elif filetype == 'Image':
parent_dir = os.path.dirname(path)
dirs = list_dir_by_path(current_commit.id, parent_dir)
if not dirs:
raise Http404
img_list = []
for dirent in dirs:
if not stat.S_ISDIR(dirent.props.mode):
fltype, flext = get_file_type_and_ext(dirent.obj_name)
if fltype == 'Image':
img_list.append(dirent.obj_name)
if len(img_list) > 1:
img_list.sort(lambda x, y : cmp(x.lower(), y.lower()))
cur_img_index = img_list.index(u_filename)
if cur_img_index != 0:
img_prev = os.path.join(parent_dir, img_list[cur_img_index - 1])
if cur_img_index != len(img_list) - 1:
img_next = os.path.join(parent_dir, img_list[cur_img_index + 1])
else:
pass
# generate file path navigator # generate file path navigator
zipped = gen_path_link(path, repo.name) zipped = gen_path_link(path, repo.name)
@@ -371,7 +375,7 @@ def view_file(request, repo_id):
'img_next': img_next, 'img_next': img_next,
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))
def view_file_common(request, repo_id, ret_dict): def view_history_file_common(request, repo_id, ret_dict):
username = request.user.username username = request.user.username
# check arguments # check arguments
repo = get_repo(repo_id) repo = get_repo(repo_id)
@@ -405,15 +409,23 @@ def view_file_common(request, repo_id, ret_dict):
filetype, fileext = get_file_type_and_ext(u_filename) filetype, fileext = get_file_type_and_ext(u_filename)
if user_perm: if user_perm:
"""Choose different approach when dealing with different type of file.""" # Check file size
if is_textual_file(file_type=filetype): fsize = get_file_size(obj_id)
handle_textual_file(request, filetype, raw_path, ret_dict) if fsize > FILE_PREVIEW_MAX_SIZE:
elif filetype == 'Document': from django.template.defaultfilters import filesizeformat
handle_document(raw_path, obj_id, fileext, ret_dict) err = _(u'File size surpasses %s, can not be opened online.') % \
elif filetype == 'PDF': filesizeformat(FILE_PREVIEW_MAX_SIZE)
handle_pdf(raw_path, obj_id, fileext, ret_dict) ret_dict['err'] = err
else: else:
pass """Choose different approach when dealing with different type of file."""
if is_textual_file(file_type=filetype):
handle_textual_file(request, filetype, raw_path, ret_dict)
elif filetype == 'Document':
handle_document(raw_path, obj_id, fileext, ret_dict)
elif filetype == 'PDF':
handle_pdf(raw_path, obj_id, fileext, ret_dict)
else:
pass
# populate return value dict # populate return value dict
ret_dict['repo'] = repo ret_dict['repo'] = repo
ret_dict['obj_id'] = obj_id ret_dict['obj_id'] = obj_id
@@ -431,7 +443,7 @@ def view_file_common(request, repo_id, ret_dict):
@repo_passwd_set_required @repo_passwd_set_required
def view_history_file(request, repo_id): def view_history_file(request, repo_id):
ret_dict = {} ret_dict = {}
view_file_common(request, repo_id, ret_dict) view_history_file_common(request, repo_id, ret_dict)
if not request.user_perm: if not request.user_perm:
return render_permission_error(request, _(u'Unable to view file')) return render_permission_error(request, _(u'Unable to view file'))
@@ -447,7 +459,7 @@ def view_history_file(request, repo_id):
@repo_passwd_set_required @repo_passwd_set_required
def view_trash_file(request, repo_id): def view_trash_file(request, repo_id):
ret_dict = {} ret_dict = {}
view_file_common(request, repo_id, ret_dict) view_history_file_common(request, repo_id, ret_dict)
if not request.user_perm: if not request.user_perm:
return render_permission_error(request, _(u'Unable to view file')) return render_permission_error(request, _(u'Unable to view file'))
@@ -470,7 +482,7 @@ def view_trash_file(request, repo_id):
@repo_passwd_set_required @repo_passwd_set_required
def view_snapshot_file(request, repo_id): def view_snapshot_file(request, repo_id):
ret_dict = {} ret_dict = {}
view_file_common(request, repo_id, ret_dict) view_history_file_common(request, repo_id, ret_dict)
if not request.user_perm: if not request.user_perm:
return render_permission_error(request, _(u'Unable to view file')) return render_permission_error(request, _(u'Unable to view file'))