too much stuff. uploader script from template. dropdown menu for tools
This commit is contained in:
211
code/app.py
211
code/app.py
@@ -4,7 +4,8 @@ import os,sys,time,stat
|
||||
import json
|
||||
from datetime import datetime
|
||||
from flask import Flask, render_template, jsonify, current_app, Response, \
|
||||
redirect, url_for, request, g, session, send_file, send_from_directory
|
||||
redirect, url_for, request, g, session, send_file, send_from_directory, \
|
||||
abort
|
||||
from werkzeug.utils import secure_filename
|
||||
import zipfile
|
||||
from multiprocessing import Process
|
||||
@@ -98,7 +99,7 @@ def upload(name = None, token = None):
|
||||
if file:
|
||||
filename = os.path.join(
|
||||
share['path'],
|
||||
secure_filename(
|
||||
secure_filename_hidden(
|
||||
file.filename
|
||||
)
|
||||
)
|
||||
@@ -133,10 +134,10 @@ def upload_join_splitted(name, token):
|
||||
if not 'filename' in request.form:
|
||||
return "No filename given", 400
|
||||
parts = []
|
||||
for part in range(100):
|
||||
for part in range(500):
|
||||
filename = os.path.join(
|
||||
share['path'],
|
||||
"%s.part.%03d"%(
|
||||
".%s.part.%03d"%(
|
||||
request.form['filename'],
|
||||
part
|
||||
)
|
||||
@@ -145,7 +146,7 @@ def upload_join_splitted(name, token):
|
||||
parts.append(filename)
|
||||
part_existed = part
|
||||
if len(parts) == 0:
|
||||
return "Invalid partial filename\n", 400
|
||||
return "Invalid partial filename %s -> %s\n"%( request.form['filename'], filename), 400
|
||||
if not len(parts) == part_existed + 1:
|
||||
return "Parts missing\n", 400
|
||||
target_name = os.path.join(
|
||||
@@ -163,6 +164,41 @@ def upload_join_splitted(name, token):
|
||||
return "Joining started\n", 200
|
||||
|
||||
|
||||
@app.route('/upload/url', methods=['POST'])
|
||||
def upload_url():
|
||||
if request.method == 'POST':
|
||||
name = request.form['name']
|
||||
url = request.form['url']
|
||||
if not is_valid_url(url):
|
||||
return "URL not valid", 400
|
||||
(ok,share) = get_share(name)
|
||||
if not ok:
|
||||
return share
|
||||
if not get_or_none('upload', share) == True:
|
||||
return "Upload not allowed\n",400
|
||||
filename = os.path.join(
|
||||
share['path'],
|
||||
secure_filename(
|
||||
os.path.basename(url)
|
||||
)
|
||||
)
|
||||
if os.path.exists(filename):
|
||||
file_versionize(filename)
|
||||
download_url(url, filename)
|
||||
set_rights(filename)
|
||||
notify({
|
||||
"recipient": get_or_none('recipient', share),
|
||||
"share": name,
|
||||
"filename": filename,
|
||||
"operation": "upload"
|
||||
})
|
||||
if 'from_gui' in request.form:
|
||||
if request.form['from_gui'] == "true":
|
||||
return redirect(url_for('list_view',name=name))
|
||||
return "File uploaded\n", 200
|
||||
|
||||
|
||||
|
||||
@app.route('/send/<name>', methods=['GET'])
|
||||
def send(name):
|
||||
(ok,share) = get_share(name)
|
||||
@@ -171,7 +207,22 @@ def send(name):
|
||||
return render_template('send.html',name=name)
|
||||
|
||||
|
||||
@app.route('/files/<name>/<token>', methods=['GET'])
|
||||
@app.route('/file/size/<name>/<token>/<path:filename>', methods=['GET'])
|
||||
def file_size(name, token, filename):
|
||||
(ok,share) = get_share(name, token = token)
|
||||
if not ok:
|
||||
return share
|
||||
full_path = os.path.join(
|
||||
share['path'],
|
||||
secure_filename_hidden(filename)
|
||||
)
|
||||
if not os.path.exists(full_path):
|
||||
return "-1", 200
|
||||
size = os.stat(full_path).st_size
|
||||
return str(size), 200
|
||||
|
||||
|
||||
@app.route('/file/list/<name>/<token>', methods=['GET'])
|
||||
def list_files(name, token):
|
||||
(ok,share) = get_share(name, token = token)
|
||||
if not ok:
|
||||
@@ -443,60 +494,99 @@ def script_upload_split(name = None, token = None):
|
||||
return share
|
||||
if not get_or_none('upload', share) == True:
|
||||
return "Upload not allowed",400
|
||||
return """#!/bin/bash
|
||||
test -n "$1" || {
|
||||
echo "Usage: [-s SplitMegabytes] file/folder [files/folders]"
|
||||
exit 1
|
||||
}
|
||||
MAXBYTES=$(( 512 * 1024 * 1024 ))
|
||||
for (( i=1; i<=$#; i++ )); do
|
||||
j=$(( $i + 1 ))
|
||||
[[ ${!i} = "-s" ]] && {
|
||||
MAXBYTES=$(( ${!j} * 1024 * 1024 ))
|
||||
shift 2
|
||||
}
|
||||
done
|
||||
CAT=$( which cat )
|
||||
which pv &> /dev/null && CAT=$( which pv )
|
||||
ROOTURL="%s"
|
||||
SHARE="%s"
|
||||
TOKEN="%s"
|
||||
|
||||
send_file() {
|
||||
$CAT "$file_name" | split -d -a 3 -b $MAXBYTES \
|
||||
--filter="curl -f -F \\"file=@-;filename=\${FILE}\\" ${ROOTURL}upload/${SHARE}/${TOKEN}" \
|
||||
- "$base_name.part." && \
|
||||
curl -F "filename=$base_name" ${ROOTURL}upload_join/${SHARE}/${TOKEN}
|
||||
}
|
||||
send_folder() {
|
||||
which pv &> /dev/null && printf -v dusize -- "--size %%dk" $( du -s -k "$file_name" | cut -f1 )
|
||||
tar c "$file_name" | $CAT $dusize - | split -d -a 3 -b $MAXBYTES \
|
||||
--filter="curl -f -F \\"file=@-;filename=\${FILE}\\" ${ROOTURL}upload/${SHARE}/${TOKEN}" \
|
||||
- "$base_name.tar.part." && \
|
||||
curl -F "filename=$base_name.tar" ${ROOTURL}upload_join/${SHARE}/${TOKEN}
|
||||
}
|
||||
|
||||
echo "Splitting to $(( $MAXBYTES / 1024 / 1024 )) Mb chunks"
|
||||
for file_name in "$@"; do
|
||||
base_name=$( basename "$file_name" )
|
||||
test -f "$file_name" && {
|
||||
printf "Sending file: %%s\n" "$file_name"
|
||||
send_file
|
||||
continue
|
||||
}
|
||||
test -d "$file_name" && {
|
||||
printf "Sending folder: %%s\n" "$file_name"
|
||||
send_folder
|
||||
continue
|
||||
}
|
||||
done
|
||||
"""%(
|
||||
request.url_root,
|
||||
name,
|
||||
token
|
||||
return render_template(
|
||||
"upload_split.py",
|
||||
name = name,
|
||||
token = token,
|
||||
rooturl = request.url_root
|
||||
)
|
||||
|
||||
|
||||
|
||||
#~ mmmmm # ""#
|
||||
#~ # "# mmm mmm m m mmmmm mmm #mmm # mmm
|
||||
#~ #mmmm" #" # # " # # # # # " # #" "# # #" #
|
||||
#~ # "m #"""" """m # # # # # m"""# # # # #""""
|
||||
#~ # " "#mm" "mmm" "mm"# # # # "mm"# ##m#" "mm "#mm"
|
||||
|
||||
#~ @app.route("/resumable/send")
|
||||
#~ def resumable_example():
|
||||
#~ return render_template("resumable_upload.html")
|
||||
|
||||
#~ # resumable.js uses a GET request to check if it uploaded the file already.
|
||||
#~ # NOTE: your validation here needs to match whatever you do in the POST (otherwise it will NEVER find the files)
|
||||
#~ @app.route("/resumable/get", methods=['GET'])
|
||||
#~ def resumable():
|
||||
#~ resumableIdentfier = request.args.get('resumableIdentifier', type=str)
|
||||
#~ resumableFilename = request.args.get('resumableFilename', type=str)
|
||||
#~ resumableChunkNumber = request.args.get('resumableChunkNumber', type=int)
|
||||
|
||||
#~ if not resumableIdentfier or not resumableFilename or not resumableChunkNumber:
|
||||
#~ # Parameters are missing or invalid
|
||||
#~ abort(500, 'Parameter error')
|
||||
|
||||
#~ # chunk folder path based on the parameters
|
||||
#~ temp_dir = os.path.join(temp_base, resumableIdentfier)
|
||||
|
||||
#~ # chunk path based on the parameters
|
||||
#~ chunk_file = os.path.join(temp_dir, get_chunk_name(resumableFilename, resumableChunkNumber))
|
||||
#~ app.logger.debug('Getting chunk: %s', chunk_file)
|
||||
|
||||
#~ if os.path.isfile(chunk_file):
|
||||
#~ # Let resumable.js know this chunk already exists
|
||||
#~ return 'OK'
|
||||
#~ else:
|
||||
#~ # Let resumable.js know this chunk does not exists and needs to be uploaded
|
||||
#~ abort(404, 'Not found')
|
||||
|
||||
|
||||
#~ # if it didn't already upload, resumable.js sends the file here
|
||||
#~ @app.route("/resumable/post", methods=['POST'])
|
||||
#~ def resumable_post():
|
||||
#~ resumableTotalChunks = request.form.get('resumableTotalChunks', type=int)
|
||||
#~ resumableChunkNumber = request.form.get('resumableChunkNumber', default=1, type=int)
|
||||
#~ resumableFilename = request.form.get('resumableFilename', default='error', type=str)
|
||||
#~ resumableIdentfier = request.form.get('resumableIdentifier', default='error', type=str)
|
||||
|
||||
#~ # get the chunk data
|
||||
#~ chunk_data = request.files['file']
|
||||
|
||||
#~ # make our temp directory
|
||||
#~ temp_dir = os.path.join(temp_base, resumableIdentfier)
|
||||
#~ if not os.path.isdir(temp_dir):
|
||||
#~ os.makedirs(temp_dir, 0777)
|
||||
|
||||
#~ # save the chunk data
|
||||
#~ chunk_name = get_chunk_name(resumableFilename, resumableChunkNumber)
|
||||
#~ chunk_file = os.path.join(temp_dir, chunk_name)
|
||||
#~ chunk_data.save(chunk_file)
|
||||
#~ app.logger.debug('Saved chunk: %s', chunk_file)
|
||||
|
||||
#~ # check if the upload is complete
|
||||
#~ chunk_paths = [os.path.join(temp_dir, get_chunk_name(resumableFilename, x)) for x in range(1, resumableTotalChunks+1)]
|
||||
#~ upload_complete = all([os.path.exists(p) for p in chunk_paths])
|
||||
|
||||
#~ # combine all the chunks to create the final file
|
||||
#~ if upload_complete:
|
||||
#~ target_file_name = os.path.join(temp_base, resumableFilename)
|
||||
#~ with open(target_file_name, "ab") as target_file:
|
||||
#~ for p in chunk_paths:
|
||||
#~ stored_chunk_file_name = p
|
||||
#~ stored_chunk_file = open(stored_chunk_file_name, 'rb')
|
||||
#~ target_file.write(stored_chunk_file.read())
|
||||
#~ stored_chunk_file.close()
|
||||
#~ os.unlink(stored_chunk_file_name)
|
||||
#~ target_file.close()
|
||||
#~ os.rmdir(temp_dir)
|
||||
#~ app.logger.debug('File saved to: %s', target_file_name)
|
||||
|
||||
#~ return 'OK'
|
||||
|
||||
|
||||
#~ def get_chunk_name(uploaded_filename, chunk_number):
|
||||
#~ return uploaded_filename + "_part_%03d" % chunk_number
|
||||
|
||||
|
||||
class uploadJoiner:
|
||||
def __init__(self, target_name, parts):
|
||||
self.target_name = target_name
|
||||
@@ -623,6 +713,13 @@ def notify(msg):
|
||||
app.config['notifier'].notify(msg)
|
||||
|
||||
|
||||
def secure_filename_hidden(filename):
|
||||
secure = secure_filename(filename)
|
||||
if filename.startswith("."):
|
||||
secure = "." + secure
|
||||
return secure
|
||||
|
||||
|
||||
def set_rights(path):
|
||||
os.chown(path, app.config['UID'], app.config['GID'])
|
||||
st = os.stat(path)
|
||||
|
||||
Reference in New Issue
Block a user