def upload_doc_api(request): user = request.user if request.user.is_authenticated else None if user is None: return HttpResponse(_('You must be logged to upload files.\n'), status=401) elif request.method != 'POST': return HttpResponse(_('Only POST requests are allowed.\n'), status=400) form = UploadApiForm(request.GET) if not form.is_valid(): return HttpResponse(_('You must supply filename, name and keywords in your query.\n'), status=400) tmp_file = tempfile.NamedTemporaryFile(mode='wb', dir=settings.FILE_UPLOAD_TEMP_DIR, delete=False) c = False chunk = request.read(32768) while chunk: tmp_file.write(chunk) c = True chunk = request.read(32768) tmp_file.flush() if not c: os.remove(tmp_file.name) return HttpResponse(_('Empty file. You must POST a valid file.\n'), status=400) # ok, we have the tmp file existing_objs = list(UploadDoc.query(request).filter(name=form.cleaned_data['name'])[0:1]) if existing_objs: doc = existing_objs[0] doc.keywords.clear() else: doc = UploadDoc(uid=str(uuid.uuid1()), name=form.cleaned_data['name'], user=user) doc.save() for keyword in strip_split(form.cleaned_data['keywords'].lower()): doc.keywords.add(Keyword.get(keyword)) scall(request, 'updoc.process_file', to=[SERVER], doc_id=doc.id, filename=tmp_file.name, original_filename=os.path.basename(form.cleaned_data['filename'])) return HttpResponse(_('File successfully uploaded. It will be uncompressed and indexed.\n'), status=200)
def handle(self, *args, **options): # require user = None if options['user'] is not None: user = get_user_model().objects.get(username=options['user']) filename = options['filename'] if filename.startswith('file://'): filename = filename[7:] if filename.startswith('http://') or filename.startswith('https://'): parsed_url = urlparse(filename) basename = os.path.basename(parsed_url.path) src_file = tempfile.NamedTemporaryFile() req = requests.get(filename, stream=True) chunk_size = 16384 for chunk in req.iter_content(chunk_size): src_file.write(chunk) else: src_file = open(filename, mode='rb') basename = os.path.basename(filename) obj = UploadDoc(uid=str(uuid.uuid1()), user=user, name=options['name'] or basename) obj.save() process_uploaded_file(obj, src_file, basename) for keyword in options['keyword']: obj.keywords.add(Keyword.get(keyword.lower().strip())) obj.save()
def upload_doc_progress(request): form = FileUploadForm(request.POST, request.FILES) if not form.is_valid(): raise PermissionDenied uploaded_file = request.FILES['file'] tmp_file = tempfile.NamedTemporaryFile(mode='wb', dir=settings.FILE_UPLOAD_TEMP_DIR, delete=False) chunk = uploaded_file.read(16384) while chunk: tmp_file.write(chunk) chunk = uploaded_file.read(16384) tmp_file.flush() basename = os.path.basename(uploaded_file.name).rpartition('.')[0] if basename.endswith('.tar'): basename = basename[:-4] doc = UploadDoc(name=basename, user=request.user if request.user.is_authenticated else None, uid=str(uuid.uuid1())) doc.save() scall(request, 'updoc.process_file', to=[SERVER], doc_id=doc.id, filename=tmp_file.name, original_filename=uploaded_file.name) # offer a correct name for the newly uploaded document form = MetadatadUploadForm(initial={'pk': doc.pk, 'name': basename, }) template_values = {'form': form, } return TemplateResponse(request, 'updoc/upload_doc_progress.html', template_values)