# -*- coding: utf-8 -*- from flask import Blueprint, Flask, request, flash, render_template, url_for, session, redirect, abort, make_response, flash, abort, send_file, send_from_directory from werkzeug.utils import secure_filename from markupsafe import escape from PIL import Image import time import sqlite3 import os from shutil import move from tools.filesutils import getFileSizeMo, getFileSizeKo, check_and_create from tools.utils import login_required filesupload = Blueprint('filesupload', __name__, template_folder='templates') app = Flask( 'pywallter' ) app.config.from_pyfile('config.py') #### Variables ################################################################################## DOSSIER_PERSO= app.config.get('DOSSIER_APP') DOSSIER_PUBLIC= app.config.get('DOSSIER_PUBLIC') extensionimg = app.config.get('EXT_IMG') DATABASE = app.config.get('DATABASE') BASE_URL= app.config.get('BASE_URL') ################################################################################################## @filesupload.route( '/filesupload/', methods=['POST']) @login_required def upload(): user = '%s'% escape(session['username']) if 'fic' not in request.files: flash(u'Mauvais format de ficher', 'error') return redirect(request.url) file = request.files['fic'] # If the user does not select a file, the browser submits an # empty file without a filename. if file.filename == '': flash(u'Vous avez oubliez de selectionner un fichier', 'error' ) else: files = request.files.getlist('fic') for f in files : nom = secure_filename(f.filename) check_and_create(os.path.join(DOSSIER_PERSO, user, 'files')) check_and_create(os.path.join(DOSSIER_PERSO, user, 'images')) if os.path.isfile(os.path.join(DOSSIER_PERSO,user, 'files', nom) or os.path.isfile(DOSSIER_PERSO, user, 'images', nom)): alert = "Le fichier "+str(f.filename)+" avec le même nom existe déjà, merci de spécifier un autre nom de fichier \n" flash(alert, 'error') else: file, ext = os.path.splitext(nom) if ext in extensionimg : f.save(os.path.join(DOSSIER_PERSO, user, 'images', nom)) image = os.path.join(DOSSIER_PERSO, user, 'images', nom) with Image.open(image) as img : img.thumbnail((300,300)) img.save(os.path.join(DOSSIER_PERSO, user, 'images','thumbnails', nom )) time_img_create=time.strftime("%A %d %B %Y %H:%M:%S") IP=request.environ['REMOTE_ADDR'] client_platform=request.headers.get('User-Agent') log_file=os.path.join(DOSSIER_PERSO, user, "log.txt") log=open(log_file, "a") log.write (time_img_create + ' - ' + IP + ' - ' + user + ' - ' + client_platform + '\n' + '---> ' + nom + '\n') log.close() else: f.save(os.path.join(DOSSIER_PERSO, user, 'files', nom)) time_file_upload=time.strftime("%A %d %B %Y %H:%M:%S") IP=request.environ.get('REMOTE_ADDR') client_platform=request.headers.get('User-Agent') log=open("log.txt", "a") # Ouvre fichier log.txt log.write (time_file_upload + ' - ' + IP + ' - ' + user + ' - ' + client_platform + '\n' + '---> ' + nom + '\n') # Écrit dans log log.close() # Ferme log.txt flash(u'Les fichiers envoyées ont été traitée avec succés', 'succes') return redirect(url_for('filesupload.list')) @filesupload.route( '/upload-dropzone', methods=['POST']) @login_required def drop_upload(): user = '%s'% escape(session['username']) file = request.files['file'] check_and_create(os.path.join(DOSSIER_PERSO, user, 'files')) check_and_create(os.path.join(DOSSIER_PERSO, user, 'images' )) filename = secure_filename(file.filename) ext = os.path.splitext(filename) is_image = False print("nom du fichier :" +filename) if ext in extensionimg : save_path = os.path.join(DOSSIER_PERSO, user, 'images', filename ) is_image = True else: save_path = os.path.join(DOSSIER_PERSO, user, 'files', filename ) current_chunk = int(request.form['dzchunkindex']) print (current_chunk) if (os.path.isfile(save_path) or os.path.isfile( os.path.join(DOSSIER_PERSO, user, 'images', filename ))) and current_chunk == 0: return make_response(('Un fichier avec le même nom existe déjà', 400)) try: with open(save_path, 'ab') as f: f.seek(int(request.form['dzchunkbyteoffset'])) f.write(file.stream.read()) except OSError: return make_response(("Une erreur est survenue," " Impossible d'écrire le fichier sur le disque", 500)) total_chunks = int(request.form['dztotalchunkcount']) if current_chunk + 1 == total_chunks: # This was the last chunk, the file should be complete and the size we expect if os.path.getsize(save_path) != int(request.form['dztotalfilesize']): return make_response(('La taille du fichier source est différentes', 500)) else: time_file_upload=time.strftime("%A %d %B %Y %H:%M:%S") IP=request.environ['REMOTE_ADDR'] client_platform=request.headers.get('User-Agent') log=open("log.txt", "a") # Ouvre fichier log.txt log.write (time_file_upload + ' - ' + IP + ' - ' + user + ' - ' + client_platform + '\n' + '---> ' + filename + '\n') # Écrit dans log log.close() # Ferme log.txt if is_image : with Image.open(save_path) as img : img.thumbnail((300,300)) img.save(os.path.join(DOSSIER_PERSO, user, 'images', 'thumbnails', filename ) ) return make_response(('Chunk upload succesfull', 200)) @filesupload.route('/view/', methods=['GET']) @login_required def list(): user = '%s'% escape(session['username']) check_and_create(os.path.join(DOSSIER_PUBLIC, user, 'files')) check_and_create(os.path.join(DOSSIER_PERSO, user, 'files')) return render_template('files.html', section="Files", BASE_URL=BASE_URL, username=user) @filesupload.route('/files//', methods=['GET']) @login_required def list_files(status: str ): user = '%s' % escape(session['username']) listFiles = [] nb_files = 0 size=0 folder="" if status == "public": folder=DOSSIER_PUBLIC else: folder=DOSSIER_PERSO files = os.listdir(os.path.join(folder, user, 'files')) if files: for fich in files: nb_files += 1 size = getFileSizeMo(os.path.join(folder, user, 'files', fich)) # size = taille des fichiers listFiles.append([nb_files, fich, size]) # On implémente la listeFichiers avec le num le ficier et sa taille resp = "

Bonjour " + user +" ça va bien putain ca marche ?

" return render_template('list_files.html', BASE_URL=BASE_URL, status=status, size=size, username=user, nb_files=nb_files, listFiles=listFiles) @filesupload.route('/myfiles//') @login_required def myfiles(username, filename): user = '%s' % escape(session['username']) return send_from_directory( os.path.join(DOSSIER_PERSO, username, 'files'), filename ) @filesupload.route('/make_public/') @login_required def move_public(filename): user = '%s' % escape(session['username']) src = os.path.join(DOSSIER_PERSO, user, 'files', filename) dst = os.path.join(DOSSIER_PUBLIC, user, 'files') move (src, dst) return redirect(url_for('filesupload.list', _external=True)) @filesupload.route('/make_private/') @login_required def move_private(filename): user = '%s' % escape(session['username']) src = os.path.join(DOSSIER_PUBLIC, user, 'files', filename) dst = os.path.join(DOSSIER_PERSO, user, 'files') move (src, dst) return redirect(url_for('filesupload.list', _external=True)) @filesupload.route('/remove_privateFile/') @login_required def remove_privateFile(filename): user = '%s' % escape(session['username']) filename = secure_filename(filename) try: os.remove( os.path.join(DOSSIER_PERSO, user, 'files', filename)) # on le supprime except FileNotFoundError: flash(u'Fichier {filename} inexistant.'.format(filename=filename), 'error') return redirect(url_for('filesupload.list', _external=True)) @filesupload.route('/remove_publicFile/') @login_required def remove_publicFile(filename): user = '%s' % escape(session['username']) filename = secure_filename(filename) try: os.remove( os.path.join(DOSSIER_PUBLIC, user, 'files', filename)) # on le supprime except FileNotFoundError: flash(u'Fichier {filename} inexistant.'.format(filename=filename), 'error') return redirect(url_for('filesupload.list', _external=True)) @filesupload.route('//blog.css') def blog_theme(author): user = author if os.path.isfile(os.path.join(DOSSIER_PERSO, user,'blog.css')): return send_file(os.path.join(DOSSIER_PERSO, user, 'blog.css'), mimetype='text/css') else: return send_file("/static/blog.css", mimetype='text/css') @filesupload.route('/theme.min.css') def theme(): if 'username' in session: user = '%s' % escape(session['username']) if os.path.isfile(os.path.join(DOSSIER_PERSO, user,'theme.min.css')): return send_file(os.path.join(DOSSIER_PERSO, user,'theme.min.css'), mimetype='text/css') return send_file("static/default.min.css", mimetype='text/css') @filesupload.route('/public//') def publicfiles(username, filename): return send_from_directory( os.path.join(DOSSIER_PUBLIC, username, 'files'), filename )