حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود

آپلود سنتر

تمرین آسان 1045 visibility link download flag

یک وبسایت آپلودسنتر برنامه نویسی کنید که کاربران بتوانند فایل های خود را آپلود کرده و لینک دانلود مستقیم آن را دریافت کنند. هر لینک و فایل مربوط به آن باید بعد از 30 روز حذف شود.

این تمرین یه پروژه ست! یعنی پتانسیل اینو داره که خیلی بیشتر روش کار بشه بنابراین ایده اصلی رو از اینجا بردار و خودت بیشتر روش کار کن تا به یه تمرین بزرگتر تبدیل یشه
👨‍💻 4 ساعت قبل کاربر ناشناس این تمرین رو مشاهده کرد

reply 4

visibility
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']);
}
پاسخ هوش مصنوعی Ai PHP DataBase
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 بنویس و ثبت کن

×
بستن