s4s-upload / app.py
soiz1's picture
Update app.py
80c74f1 verified
import os
import base64
from flask import Flask, render_template, request, redirect, url_for
import pymysql
import magic
app = Flask(__name__)
# アップロードされたファイルを保存するためのディレクトリ
UPLOAD_FOLDER = 'uploads'
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
# ファイルをbase64エンコードする関数
def file_to_base64(file_path):
with open(file_path, "rb") as f:
return base64.b64encode(f.read()).decode('utf-8')
# 新しいプロジェクトをデータベースにアップロードする関数
def upload_project(thumbnail, group, name, explanation, file_data):
pass
# プロジェクトのアップロードフォーム
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
# フォームからのデータを取得
thumbnail_file = request.files['thumbnail']
name = request.form['name']
explanation = request.form['explanation']
file_data_file = request.files['file_data']
# 画像とファイルのBase64エンコード
if thumbnail_file:
thumbnail_path = os.path.join(UPLOAD_FOLDER, thumbnail_file.filename)
thumbnail_file.save(thumbnail_path)
thumbnail = file_to_base64(thumbnail_path)
else:
thumbnail = None # サムネイルがなければNoneに設定
if file_data_file:
file_data_path = os.path.join(UPLOAD_FOLDER, file_data_file.filename)
file_data_file.save(file_data_path)
file_data = file_to_base64(file_data_path)
else:
file_data = None # txtファイルがない場合の処理
group = "" # 所属グループは空白
# プロジェクトをデータベースにアップロード
upload_project(thumbnail, group, name, explanation, file_data)
return redirect(url_for('index'))
return render_template('index.html')
@app.route('/close', methods=['GET', 'POST'])
def close():
return """<script>if (window.opener) {
const hashParams = new URLSearchParams(window.location.hash.substring(1));
const token = hashParams.get("access_token");
if (token) {
window.opener.postMessage({ token }, "*");
window.close();
}
}
window.close();
</script>"""
@app.route('/close2', methods=['GET', 'POST'])
def close2():
target_origin = request.args.get('target_origin', '*') # デフォルトはワイルドカード
return f"""<script>
if (window.opener) {{
const hashParams = new URLSearchParams(window.location.hash.substring(1));
const token = hashParams.get("access_token");
if (token) {{
window.opener.postMessage({{ token }}, "{target_origin}");
window.close();
}}
}}
window.close();
</script>"""
@app.route('/close3')
def close3():
target_origin = request.args.get('target_origin', '*')
return f'''
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>認証処理中...</title>
<script>
window.addEventListener('load', function () {{
const hashParams = new URLSearchParams(window.location.hash.substring(1));
const queryParams = new URLSearchParams(window.location.search);
const tokenData = {{
access_token: hashParams.get('access_token'),
expires_in: hashParams.get('expires_in'),
error: hashParams.get('error') || queryParams.get('error'),
state: queryParams.get('state'),
close_window: true // ✅ ここで一緒に送る
}};
console.log("Token Data:", tokenData);
if (window.opener && typeof window.opener.postMessage === 'function') {{
try {{
window.opener.postMessage(tokenData, '{target_origin}');
console.log('✅ メッセージ送信成功');
}} catch (e) {{
console.error('❌ postMessage 送信エラー:', e);
window.opener.postMessage({{ error: 'postmessage_failed' }}, '{target_origin}');
}}
setTimeout(() => window.close(), 500);
}} else {{
console.warn("❌ window.opener が存在しません。ポップアップがブロックされた可能性があります。");
document.body.innerHTML += '<p style="color:red;">ポップアップブロックが原因で処理が中断されました。<br>このウィンドウを閉じてやり直してください。</p>';
}}
}});
</script>
</head>
<body>
<div style="padding: 20px; text-align: center;">
<h3>認証処理中...</h3>
<p>このウィンドウは自動的に閉じられます</p>
<button onclick="window.close()">手動で閉じる</button>
</div>
</body>
</html>
'''
@app.route('/close4')
def close4():
query = request.query_string.decode()
return f'''
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ログイン中...</title>
<script>
window.location.href = "https://scratch-school.ct.ws/login.php?{query}";
</script>
</head>
<body>
<p>ログイン処理中です。しばらくお待ちください...</p>
</body>
</html>
'''
if __name__ == '__main__':
app.run(host='0.0.0.0', port=7860)