def view(self, request, **kwargs):
'''
allow a file to be viewed as opposed to download. This is particularly needed when a video file is stored
in the fileservice and user wants to be able to use a view the video as opposed to having to download it
first. It passes the serving of the file to nginx/apache which will return all the proper headers allowing,
say, html5's video viewer's 'seek' indicator/knob to work. Otherwise the video is only played sequentially
Note that nginx/apache need to be configured accordingly. nginx for example:
location /var/lib/geoserver_data/file-service-store/ {
# forces requests to be authorized
internal;
alias /var/lib/geoserver_data/file-service-store/;
}
for apache, need to install xsendfile module, enable it, set the path and then
XSendFile on
XSendFilePath /var/lib/geoserver_data/file-service-store
example use:
/fileservice/view/med.mp4
or
/fileservice/med.mp4/view
Note that media players tend to require the route to end with the filename like /fileservice/view/med.mp4
'''
# method check to avoid bad requests
self.method_check(request, allowed=['get'])
# Must be done otherwise endpoint will be wide open
self.is_authenticated(request)
file_item_name = kwargs.get('name', None)
url = urllib.pathname2url(file_item_name)
mime = MimeTypes()
mime_type = mime.guess_type(url)
response = HttpResponse(content_type=mime_type[0])
file_with_route = smart_str('{}{}'.format(helpers.get_fileservice_dir(), file_item_name))
# apache header
response['X-Sendfile'] = file_with_route
# nginx header
response['X-Accel-Redirect'] = file_with_route
return response
评论列表
文章目录