آپلود سنتر
یک وبسایت آپلودسنتر برنامه نویسی کنید که کاربران بتوانند فایل های خود را آپلود کرده و لینک دانلود مستقیم آن را دریافت کنند. هر لینک و فایل مربوط به آن باید بعد از 30 روز حذف شود.
یک وبسایت آپلودسنتر برنامه نویسی کنید که کاربران بتوانند فایل های خود را آپلود کرده و لینک دانلود مستقیم آن را دریافت کنند. هر لینک و فایل مربوط به آن باید بعد از 30 روز حذف شود.
from flask import Flask, request, redirect, url_for, render_template
from flask_sqlalchemy import SQLAlchemy
import os
import datetime
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///uploads.db'
app.config['UPLOAD_FOLDER'] = 'uploads'
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # حداکثر اندازه فایل 16 مگابایت
db = SQLAlchemy(app)
# مدل پایگاه داده برای فایلها
class UploadedFile(db.Model):
id = db.Column(db.Integer, primary_key=True)
filename = db.Column(db.String(100), nullable=False)
upload_time = db.Column(db.DateTime, default=datetime.datetime.utcnow)
# ایجاد پوشه برای ذخیره فایلها
if not os.path.exists(app.config['UPLOAD_FOLDER']):
os.makedirs(app.config['UPLOAD_FOLDER'])
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
if 'file' not in request.files:
return 'فایلی انتخاب نشده است.'
file = request.files['file']
if file.filename == '':
return 'نام فایل نامعتبر است.'
# ذخیره فایل
file_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
file.save(file_path)
# ذخیره اطلاعات در پایگاه داده
new_file = UploadedFile(filename=file.filename)
db.session.add(new_file)
db.session.commit()
return f'فایل شما با موفقیت آپلود شد. <a href="{url_for("download_file", file_id=new_file.id)}">لینک دانلود</a>'
return render_template('index.html')
@app.route('/download/<int:file_id>')
def download_file(file_id):
file_record = UploadedFile.query.get_or_404(file_id)
file_path = os.path.join(app.config['UPLOAD_FOLDER'], file_record.filename)
# بررسی زمان انقضا (30 روز)
if datetime.datetime.utcnow() - file_record.upload_time > datetime.timedelta(days=30):
return 'این فایل منقضی شده است و دیگر قابل دانلود نیست.'
return redirect(url_for('static', filename=file_record.filename))
@app.route('/cleanup')
def cleanup():
"""حذف فایلهای منقضی شده از پایگاه داده و سیستم فایل."""
expired_files = UploadedFile.query.filter(datetime.datetime.utcnow() - UploadedFile.upload_time > datetime.timedelta(days=30)).all()
for file_record in expired_files:
file_path = os.path.join(app.config['UPLOAD_FOLDER'], file_record.filename)
if os.path.exists(file_path):
os.remove(file_path)
db.session.delete(file_record)
db.session.commit()
return 'فایلهای منقضی شده حذف شدند.'
if __name__ == '__main__':
db.create_all() # ایجاد جداول پایگاه داده
app.run(debug=True)
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>آپلودسنتر</title>
</head>
<body>
<h1>آپلود فایل</h1>
<form method="POST" enctype="multipart/form-data">
<input type="file" name="file" required>
<button type="submit">آپلود</button>
</form>
</body>
</html>
/upload_center
├── /uploads // دایرکتوری برای ذخیره فایلهای آپلود شده
├── /assets
│ ├── style.css // فایل CSS
│ └── script.js // فایل JavaScript (اختیاری)
├── index.php // صفحه اصلی
├── upload.php // پردازش آپلود فایل
├── download.php // صفحه دانلود فایل
├── database.php // اتصال به پایگاه داده
├── delete_files.php // حذف فایلهای قدیمی
└── config.php // تنظیمات اولیه
2. تنظیمات پایگاه داده
ابتدا، باید یک پایگاه داده ایجاد کنیم. میتوانید از MySQL استفاده کنید. برای ایجاد پایگاه داده، میتوانید از کد SQL زیر استفاده کنید:
sql
CREATE DATABASE upload_center;
USE upload_center;
CREATE TABLE files (
id INT AUTO_INCREMENT PRIMARY KEY,
filename VARCHAR(255) NOT NULL,
filepath VARCHAR(255) NOT NULL,
upload_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
3. فایل config.php
این فایل برای تنظیمات اولیه و اتصال به پایگاه داده استفاده میشود.
php
<?php
$host = 'localhost';
$db = 'upload_center';
$user = 'your_username'; // نام کاربری پایگاه داده
$pass = 'your_password'; // رمز عبور پایگاه داده
// اتصال به پایگاه داده
$conn = new mysqli($host, $user, $pass, $db);
// بررسی اتصال
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
?>
4. فایل index.php
این فایل صفحه اصلی وبسایت است که فرم آپلود فایل را نمایش میدهد.
php
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>آپلودسنتر</title>
<link rel="stylesheet" href="assets/style.css">
</head>
<body>
<h1>آپلودسنتر</h1>
<form action="upload.php" method="POST" enctype="multipart/form-data">
<input type="file" name="file" required>
<button type="submit">آپلود فایل</button>
</form>
</body>
</html>
5. فایل upload.php
این فایل برای پردازش آپلود فایل و ذخیره اطلاعات آن در پایگاه داده استفاده میشود.
php
<?php
include('config.php');
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['file'])) {
$file = $_FILES['file'];
$upload_dir = 'uploads/';
$filename = basename($file['name']);
$filepath = $upload_dir . $filename;
// انتقال فایل به دایرکتوری uploads
if (move_uploaded_file($file['tmp_name'], $filepath)) {
// ذخیره اطلاعات فایل در پایگاه داده
$stmt = $conn->prepare("INSERT INTO files (filename, filepath) VALUES (?, ?)");
$stmt->bind_param("ss", $filename, $filepath);
$stmt->execute();
$stmt->close();
echo "فایل با موفقیت آپلود شد. <br>";
echo "لینک دانلود: <a href='download.php?id=" . $conn->insert_id . "'>دانلود فایل</a>";
} else {
echo "خطا در آپلود فایل.";
}
}
?>
6. فایل download.php
این فایل برای دانلود فایلها استفاده میشود.
php
<?php
include('config.php');
if (isset($_GET['id'])) {
$id = $_GET['id'];
// دریافت اطلاعات فایل
$stmt = $conn->prepare("SELECT * FROM files WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
$file = $result->fetch_assoc();
$stmt->close();
if ($file) {
// دانلود فایل
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($file['filepath']) . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file['filepath']));
readfile($file['filepath']);
exit;
} else {
echo "فایل یافت نشد.";
}
}
?>
7. فایل delete_files.php
این فایل برای حذف فایلهای قدیمیتر از 30 روز استفاده میشود.
php
<?php
include('config.php');
// حذف فایلهای قدیمی
$expiration_time = date('Y-m-d H:i:s', strtotime('-30 days'));
$stmt = $conn->prepare("DELETE FROM files WHERE upload_time < ?");
$stmt->bind_param("s", $expiration_time);
$stmt->execute();
$stmt->close();
echo "فایلهای قدیمی با موفقیت حذف شدند.";
?>
برای ایجاد یک وبسایت آپلودسنتر ساده با PHP و MySQL، میتوانید از کد زیر استفاده کنید:
// upload.php
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['file'])) {
$file = $_FILES['file'];
$uploadDir = 'uploads/';
$uploadFile = $uploadDir . basename($file['name']);
if (move_uploaded_file($file['tmp_name'], $uploadFile)) {
// ذخیره اطلاعات در دیتابیس
$expiryDate = date('Y-m-d H:i:s', strtotime('+30 days'));
$conn = new mysqli('localhost', 'username', 'password', 'database');
$stmt = $conn->prepare("INSERT INTO files (filename, expiry_date) VALUES (?, ?)");
$stmt->bind_param("ss", $file['name'], $expiryDate);
$stmt->execute();
echo "File uploaded successfully. Download link: <a href='$uploadFile'>$uploadFile</a>";
} else {
echo "File upload failed.";
}
}
-- SQL برای ایجاد جدول
CREATE TABLE files (
id INT AUTO_INCREMENT PRIMARY KEY,
filename VARCHAR(255) NOT NULL,
expiry_date DATETIME NOT NULL
);
برای حذف فایلها پس از 30 روز، میتوانید یک کرون جاب تنظیم کنید که هر روز اجرا شود:
// delete_expired.php
$conn = new mysqli('localhost', 'username', 'password', 'database');
$result = $conn->query("SELECT * FROM files WHERE expiry_date < NOW()");
while ($row = $result->fetch_assoc()) {
unlink('uploads/' . $row['filename']);
$conn->query("DELETE FROM files WHERE id = " . $row['id']);
}
import os
from flask import Flask, request, redirect, url_for, render_template, send_from_directory, flash
from flask_sqlalchemy import SQLAlchemy
from flask_uploads import UploadSet, configure_uploads, ALL, patch_request_class
from datetime import datetime, timedelta
from threading import Thread
import time
app = Flask(__name__)
app.config['SECRET_KEY'] = 'supersecretkey'
app.config['UPLOADED_FILES_DEST'] = 'uploads'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///uploads.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
files = UploadSet('files', ALL)
configure_uploads(app, files)
patch_request_class(app, 16 * 1024 * 1024)
db = SQLAlchemy(app)
class File(db.Model):
id = db.Column(db.Integer, primary_key=True)
filename = db.Column(db.String(100), nullable=False)
upload_time = db.Column(db.DateTime, default=datetime.utcnow)
def delete_old_files():
while True:
now = datetime.utcnow()
expiration_time = now - timedelta(days=30)
old_files = File.query.filter(File.upload_time < expiration_time).all()
for old_file in old_files:
try:
os.remove(os.path.join(app.config['UPLOADED_FILES_DEST'], old_file.filename))
db.session.delete(old_file)
db.session.commit()
except Exception as e:
print(f"Error deleting file {old_file.filename}: {e}")
time.sleep(86400)
@app.route('/', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST' and 'file' in request.files:
file = request.files['file']
if file:
filename = files.save(file)
new_file = File(filename=filename)
db.session.add(new_file)
db.session.commit()
download_url = url_for('download_file', filename=filename, _external=True)
flash(f'File uploaded successfully! Download link: {download_url}')
return redirect(url_for('upload_file'))
return render_template('index.html')
@app.route('/uploads/<filename>')
def download_file(filename):
return send_from_directory(app.config['UPLOADED_FILES_DEST'], filename)
if __name__ == '__main__':
db.create_all()
Thread(target=delete_old_files, daemon=True).start()
app.run(debug=True)
فایل HTML (index.html):
<!DOCTYPE html>
<html>
<head>
<title>Upload Center</title>
</head>
<body>
<h1>Upload a File</h1>
<form method="POST" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="Upload">
</form>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
</body>
</html>
جوابت را با Markdown بنویس و ثبت کن
برای استفاده از این بخش باید وارد حساب کاربریت بشی
ورود/ثبت نامتوضیح کوتاهی بنویسید تا تیم بررسی کند.