# API Upload Video, Image, GIF với PHP

## 📁 Cấu trúc thư mục
```
uploads/
├── api.php          # File API chính
├── config.php       # File cấu hình
├── index.html       # Giao diện test
├── videos/          # Thư mục lưu video
├── images/          # Thư mục lưu ảnh
├── gifs/           # Thư mục lưu GIF
└── stores/         # Thư mục lưu ảnh store
```

## 🚀 Cách sử dụng

### 1. Test qua giao diện web
- Mở trình duyệt và truy cập: `http://localhost/uploads/`
- Chọn file và click upload
- Xem kết quả và danh sách file đã upload

### 2. Sử dụng API trực tiếp

#### Upload Video
```bash
curl -X POST -F "video=@path/to/video.mp4" "http://localhost/uploads/api.php?action=upload_video"
```

#### Upload Image
```bash
curl -X POST -F "image=@path/to/image.jpg" "http://localhost/uploads/api.php?action=upload_image"
```

#### Upload GIF
```bash
curl -X POST -F "gif=@path/to/animation.gif" "http://localhost/uploads/api.php?action=upload_gif"
```

#### Upload Store Image
```bash
curl -X POST -F "store=@path/to/store.jpg" "http://localhost/uploads/api.php?action=upload_store"
```

#### Lấy danh sách file
```bash
curl "http://localhost/uploads/api.php?action=get_files"
```

## 📋 Các endpoint API

| Endpoint | Method | Parameter | Mô tả |
|----------|--------|-----------|-------|
| `?action=upload_video` | POST | `video` | Upload file video |
| `?action=upload_image` | POST | `image` | Upload file ảnh |
| `?action=upload_gif` | POST | `gif` | Upload file GIF |
| `?action=upload_store` | POST | `store` | Upload ảnh store |
| `?action=get_files` | GET | - | Lấy danh sách file |

## ⚙️ Cấu hình

### Kích thước file tối đa:
- Video: 100MB
- Image: 10MB
- GIF: 20MB
- Store: 15MB

### Định dạng file được hỗ trợ:
- **Video**: mp4, avi, mov, wmv, flv, webm
- **Image**: jpg, jpeg, png, bmp, webp
- **GIF**: gif
- **Store**: jpg, jpeg, png, webp (kích thước tối thiểu 200x200)

## 📤 Format response JSON

### Thành công:
```json
{
    "success": true,
    "message": "Upload thành công",
    "data": {
        "original_name": "video.mp4",
        "new_name": "64f5a1b2c3d4e5f6_1703123456.mp4",
        "size": "25.3 MB",
        "type": "video",
        "url": "videos/64f5a1b2c3d4e5f6_1703123456.mp4",
        "upload_time": "2024-12-21 10:30:56"
    }
}
```

### Lỗi:
```json
{
    "success": false,
    "message": "File quá lớn. Kích thước tối đa: 100 MB"
}
```

## 🔧 Cài đặt và yêu cầu

### Yêu cầu hệ thống:
- PHP 7.0+
- Extension: fileinfo, gd (cho image processing)
- Apache/Nginx với mod_rewrite

### Cài đặt:
1. Copy toàn bộ file vào thư mục web server
2. Đảm bảo thư mục `videos/`, `images/`, `gifs/` có quyền ghi (chmod 755)
3. Kiểm tra cấu hình PHP:
   - `upload_max_filesize` >= 100M
   - `post_max_size` >= 100M
   - `max_execution_time` >= 300

### Cấu hình Apache (.htaccess):
```apache
# Tăng giới hạn upload
php_value upload_max_filesize 100M
php_value post_max_size 100M
php_value max_execution_time 300
php_value memory_limit 256M

# Bảo mật
Options -Indexes
```

## 🛡️ Tính năng bảo mật

1. **Kiểm tra extension file**: Chỉ cho phép các định dạng được định nghĩa
2. **Kiểm tra MIME type**: Đặc biệt với GIF
3. **Kiểm tra file ảnh thật**: Sử dụng `getimagesize()`
4. **Đổi tên file**: Tránh conflict và bảo mật
5. **Giới hạn kích thước**: Tránh DoS attack
6. **CORS headers**: Hỗ trợ cross-origin requests

## 🔍 Troubleshooting

### Lỗi thường gặp:

1. **"File quá lớn"**
   - Kiểm tra cấu hình PHP: `upload_max_filesize`, `post_max_size`
   - Kiểm tra cấu hình trong `config.php`

2. **"Không thể lưu file"**
   - Kiểm tra quyền ghi thư mục: `chmod 755 videos/ images/ gifs/`
   - Kiểm tra dung lượng đĩa cứng

3. **"Định dạng file không được hỗ trợ"**
   - Kiểm tra extension file
   - Thêm định dạng mới vào mảng `$allowedTypes` trong `config.php`

4. **Timeout khi upload file lớn**
   - Tăng `max_execution_time` trong PHP
   - Tăng `max_input_time`

## 📱 Example sử dụng với JavaScript

```javascript
async function uploadFile(file, type) {
    const formData = new FormData();
    formData.append(type, file);
    
    try {
        const response = await fetch(`api.php?action=upload_${type}`, {
            method: 'POST',
            body: formData
        });
        
        const result = await response.json();
        
        if (result.success) {
            console.log('Upload thành công:', result.data);
        } else {
            console.error('Lỗi:', result.message);
        }
    } catch (error) {
        console.error('Lỗi kết nối:', error);
    }
}
```

## 🎨 Tính năng mới - Filter làm đẹp ảnh

### Các API upload đã được nâng cập với filter làm đẹp:

#### Upload Image với filter
```bash
curl -X POST \
  -F "image=@photo.jpg" \
  -F "filter=beauty" \
  -F "brightness=110" \
  -F "contrast=105" \
  -F "saturation=105" \
  -F "quality=90" \
  "http://localhost/uploads/api.php?action=upload_image"
```

#### Upload Store với filter
```bash
curl -X POST \
  -F "store=@store_logo.jpg" \
  -F "filter=bright" \
  -F "brightness=115" \
  -F "contrast=100" \
  -F "saturation=100" \
  -F "quality=95" \
  "http://localhost/uploads/api.php?action=upload_store"
```

#### Lấy danh sách filter có sẵn
```bash
curl "http://localhost/uploads/api.php?action=get_filters"
```

### 🎭 Các filter làm đẹp có sẵn:

| Filter ID | Tên | Brightness | Contrast | Saturation | Blur | Đặc biệt |
|-----------|-----|------------|----------|------------|------|----------|
| `none` | Bình thường | 100% | 100% | 100% | 0 | - |
| `soft` | Da mềm mịn | 105% | 95% | 95% | 0 | - |
| `bright` | Da sáng | 110% | 90% | 105% | 0 | - |
| `glow` | Da rạng rỡ | 110% | 110% | 110% | 0 | - |
| `smooth` | Da mượt | 105% | 90% | 95% | 0.2 | Blur nhẹ |
| `vintage` | Hoài cổ | 90% | 110% | 0% | 0 | Sepia |
| `beauty` | Làm đẹp | 108% | 105% | 105% | 0.5 | Blur mềm |
| `brightSkin` | Da sáng bóng | 115% | 100% | 100% | 0.3 | - |
| `pinkLips` | Môi hồng | 105% | 105% | 115% | 0 | - |
| `slimFace` | Mặt thon | 105% | 105% | 100% | 0.4 | - |

### 📋 Tham số tùy chỉnh:

| Tham số | Mô tả | Giá trị | Mặc định |
|---------|--------|---------|----------|
| `filter` | ID filter từ bảng trên | string | `none` |
| `brightness` | Độ sáng (50-150) | integer | 100 |
| `contrast` | Độ tương phản (50-150) | integer | 100 |
| `saturation` | Độ bão hòa (50-150) | integer | 100 |
| `blur` | Độ mờ (0-10) | float | 0 |
| `quality` | Chất lượng JPEG (10-100) | integer | 85 |

## 📤 Format response JSON cập nhật

### Thành công với filter:
```json
{
    "success": true,
    "message": "Upload ảnh thành công với filter beauty",
    "data": {
        "original_name": "photo.jpg",
        "new_name": "64f5a1b2c3d4e5f6_1703123456.jpg",
        "size": "2.1 MB",
        "dimensions": "1920x1080",
        "type": "image",
        "url": "images/64f5a1b2c3d4e5f6_1703123456.jpg",
        "upload_time": "2024-12-21 10:30:56",
        "applied_filter": "beauty",
        "quality": 90,
        "enhancements": {
            "brightness": 108,
            "contrast": 105,
            "saturation": 105,
            "blur": 0.5
        }
    }
}
```

### Response filter list:
```json
{
    "success": true,
    "message": "Lấy danh sách filter thành công",
    "data": {
        "filters": {
            "none": {
                "name": "Bình thường",
                "brightness": 100,
                "contrast": 100,
                "saturate": 100,
                "blur": 0
            },
            "beauty": {
                "name": "Làm đẹp",
                "brightness": 108,
                "contrast": 105,
                "saturate": 105,
                "blur": 0.5
            }
        },
        "total_filters": 10
    }
}
```

## 📋 Các endpoint API cập nhật

| Endpoint | Method | Parameters | Mô tả |
|----------|--------|-------------|-------|
| `?action=upload_video` | POST | `video`, `filter`, `brightness`, `contrast`, `saturation`, `quality` | Upload video với tham số làm đẹp |
| `?action=upload_image` | POST | `image`, `filter`, `brightness`, `contrast`, `saturation`, `blur`, `quality` | Upload ảnh với filter làm đẹp |
| `?action=upload_gif` | POST | `gif`, `filter`, `brightness`, `contrast`, `saturation`, `quality` | Upload GIF với tham số |
| `?action=upload_store` | POST | `store`, `filter`, `brightness`, `contrast`, `saturation`, `blur`, `quality` | Upload ảnh store với filter |
| `?action=get_files` | GET | - | Lấy danh sách file |
| `?action=get_filters` | GET | - | Lấy danh sách filter có sẵn |

## 🎨 Cách sử dụng với JavaScript

```javascript
async function uploadWithFilter(file, type, filterOptions = {}) {
    const formData = new FormData();
    formData.append(type, file);
    
    // Thêm filter parameters
    const {
        filter = 'none',
        brightness = 100,
        contrast = 100,
        saturation = 100,
        blur = 0,
        quality = 85
    } = filterOptions;
    
    formData.append('filter', filter);
    formData.append('brightness', brightness);
    formData.append('contrast', contrast);
    formData.append('saturation', saturation);
    if (blur > 0) formData.append('blur', blur);
    formData.append('quality', quality);
    
    try {
        const response = await fetch(`api.php?action=upload_${type}`, {
            method: 'POST',
            body: formData
        });
        
        const result = await response.json();
        
        if (result.success) {
            console.log('Upload thành công với filter:', result.data.applied_filter);
            console.log('Enhancements applied:', result.data.enhancements);
        } else {
            console.error('Lỗi:', result.message);
        }
    } catch (error) {
        console.error('Lỗi kết nối:', error);
    }
}

// Ví dụ sử dụng
const fileInput = document.getElementById('imageFile');
const file = fileInput.files[0];

uploadWithFilter(file, 'image', {
    filter: 'beauty',
    brightness: 110,
    contrast: 105,
    saturation: 105,
    quality: 90
});
```

## 🔍 Troubleshooting cho filter

### Lỗi thường gặp:

1. **"Filter không tồn tại"**
   - Kiểm tra ID filter trong danh sách `get_filters`
   - Sử dụng `none` nếu không muốn áp dụng filter

2. **"Không thể áp dụng filter"**
   - Kiểm tra extension GD được bật trong PHP
   - Đảm bảo file ảnh hợp lệ và không bị lỗi

3. **"Chất lượng ảnh giảm"**
   - Tăng tham số `quality` (tối đa 100)
   - Giảm độ `blur` nếu ảnh quá mờ

4. **"Tham số không hợp lệ"**
   - `brightness`, `contrast`, `saturation`: 50-150
   - `blur`: 0-10 (float)
   - `quality`: 10-100

## 📝 License
MIT License - Sử dụng tự do cho mục đích cá nhân và thương mại.
