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)