Beispiel #1
0
 def get(self):
     url = self.request.get("url")
     if not url:
         self.response.out.write("download?url=file_url")
         return
     mixed_result = self.check_exist_and_sustainable(url)
     if mixed_result == None:
         self.response.out.write('error: url resource not found, or network error.')
         return
     if mixed_result == False:
         self.response.out.write('error: url resource cannot support continually download.')
         # todo small file download
         return
     # else result is a size
     try:
         filename, size, mimetype = mixed_result
     except:
         self.response.out.write('internal error: function "check_exist_and_sustainable" returned %s.' %str(mixed_result))
         return
     # got file size
     if size > 500*1024*1024:
         self.response.out.write('要下载的文件太大了(超过500MB),单个app承受不起啊(每天就1G流量..),正在计划搭建下载均衡器,请关注.<br><a href="list">返回</a>')
         return
     # calculate block_number
     block_number = calc_block_number(size)
     # create file record
     from model import EStatus, File
     from google.appengine.api import users
     downloader = users.get_current_user()
     new_file = File.get_or_insert('%s-%s'%(downloader, url), name = filename, url = url, downloader = downloader, size = size, mimetype = mimetype, status = EStatus.DOWNLOADING)
     new_file.put()
     key = new_file.key()
     from google.appengine.api import taskqueue
     def add_task():
         # add task
         for n in range(block_number):
             if n == block_number - 1: last = 'true'
             else: last = ''
             try:
                 taskqueue.add(url='/downloadfileblock', queue_name=conf.DOWNLOAD_FILEBLOCK_QUEUE_NAME, method='GET', params={'url': url, 'key': key, 'n': n, 'last': last}, transactional=False)
             except taskqueue.TombstonedTaskError:
                 logging.warn('added a task which is already run, url: %s, block_num: %d' %(url, n))
                 # added a task with that exact name before which is already run
                 # executed task names are kept around for some time to prevent accidental duplicates
                 pass
     add_task()
     self.response.out.write('添加成功!<br><a href="list">返回</a>')
     echo = 'Added tasks into queue: "%s" and started downloading, url: %s' %(conf.DOWNLOAD_FILEBLOCK_QUEUE_NAME, url)
     logging.info(echo)