Merhaba, İşletmem için geliştirdiğim bir depo yönetimi yazılımı için yardımcı araç olarak geliştirdiğim hızlı resim yükleme yazılımının ilk halini ücretsiz paylaşıyorum. Çok basit ve gelişime açık index.php kodları :
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$uploadDir = 'uploads/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0755, true);
}
$response = [];
foreach ($_FILES['image']['name'] as $key => $fileName) {
$uniqueId = uniqid();
$fileExtension = pathinfo($fileName, PATHINFO_EXTENSION);
$shortFileName = $uniqueId . '.' . $fileExtension;
$targetFile = $uploadDir . $shortFileName;
$imageFileType = strtolower($fileExtension);
$allowedTypes = ['jpg', 'jpeg', 'png', 'gif'];
if (!in_array($imageFileType, $allowedTypes)) {
$response[] = ['success' => false, 'message' => 'Sadece JPG, JPEG, PNG ve GIF dosyaları yüklenebilir.'];
continue;
}
if ($_FILES['image']['size'][$key] > 5 * 1024 * 1024) {
$response[] = ['success' => false, 'message' => 'Dosya boyutu 5MB\'yi aşamaz.'];
continue;
}
if (move_uploaded_file($_FILES['image']['tmp_name'][$key], $targetFile)) {
file_put_contents($targetFile . '.time', time());
$shortUrl = 'http://' . $_SERVER['HTTP_HOST'] . '/uploads/' . $shortFileName;
$response[] = [
'success' => true,
'url' => $shortUrl,
'preview' => $shortUrl
];
} else {
$response[] = ['success' => false, 'message' => 'Resim yüklenirken bir hata oluştu.'];
}
}
echo json_encode($response);
exit;
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CorexDepo | Hızlı Resim Yükle</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
body {
background: linear-gradient(135deg, #6e7dff, #1c92d2);
font-family: 'Roboto', sans-serif;
}
.container {
max-width: 700px;
margin: auto;
background: #fff;
padding: 40px;
border-radius: 10px;
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
}
h1 {
text-align: center;
color: #333;
margin-bottom: 30px;
}
.progress-container {
display: none;
margin-top: 20px;
}
.progress {
height: 25px;
border-radius: 12px;
overflow: hidden;
}
.progress-bar {
transition: width 0.4s ease-in-out;
}
.image-preview-container {
display: flex;
flex-wrap: wrap;
gap: 20px;
margin-top: 30px;
}
.image-item {
text-align: center;
border: 1px solid #ddd;
border-radius: 8px;
padding: 15px;
background: #f9f9f9;
margin-bottom: 20px;
}
.image-item img {
max-width: 100%;
border-radius: 8px;
margin-bottom: 10px;
}
.copy-btn {
background: #0d6efd;
color: #fff;
border: none;
padding: 8px 12px;
cursor: pointer;
border-radius: 4px;
font-size: 0.9rem;
transition: background-color 0.3s;
}
.copy-btn:hover {
background: #0b5ed7;
}
</style>
</head>
<body>
<div class="container">
<h1>Hızlı Resim Yükleme</h1>
<form id="uploadForm" enctype="multipart/form-data" class="mb-4">
<div class="mb-3">
<label for="image" class="form-label">Resim Seçin (En Fazla 7 Adet):</label>
<input type="file" name="image[]" id="image" class="form-control" multiple required>
</div>
<button type="submit" class="btn btn-primary w-100">Yükle</button>
</form>
<div class="progress-container">
<div class="progress">
<div class="progress-bar bg-success" role="progressbar" style="width: 0%;" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>
</div>
<p class="text-center mt-2" id="loadingText">Yükleme Başladı...</p>
</div>
<div class="image-preview-container" id="previewContainer"></div>
</div>
<script>
const uploadForm = document.getElementById('uploadForm');
const progressContainer = document.querySelector('.progress-container');
const progressBar = document.querySelector('.progress-bar');
const loadingText = document.getElementById('loadingText');
const previewContainer = document.getElementById('previewContainer');
const imageInput = document.getElementById('image');
uploadForm.addEventListener('submit', async (e) => {
e.preventDefault();
if (imageInput.files.length > 7) {
alert('En fazla 7 dosya yükleyebilirsiniz.');
return;
}
const formData = new FormData(uploadForm);
progressContainer.style.display = 'block';
progressBar.style.width = '0%';
loadingText.textContent = 'Yükleme Başladı...';
const xhr = new XMLHttpRequest();
xhr.open('POST', '', true);
xhr.upload.onprogress = (event) => {
if (event.lengthComputable) {
const percentComplete = Math.round((event.loaded / event.total) * 100);
progressBar.style.width = `${percentComplete}%`;
loadingText.textContent = `Yükleniyor: %${percentComplete}`;
}
};
xhr.onload = () => {
if (xhr.status === 200) {
const result = JSON.parse(xhr.responseText);
previewContainer.innerHTML = '';
result.forEach(file => {
const imageItem = document.createElement('div');
imageItem.classList.add('image-item');
if (file.success) {
imageItem.innerHTML = `
<img src="${file.preview}" alt="Önizleme">
<input type="text" value="${file.url}" class="form-control mb-2" readonly>
<button class="copy-btn" onclick="copyToClipboard('${file.url}')">Linki Kopyala</button>
`;
} else {
imageItem.textContent = file.message;
}
previewContainer.appendChild(imageItem);
});
loadingText.textContent = 'Yükleme Tamamlandı!';
} else {
loadingText.textContent = 'Sunucu Hatası.';
}
};
xhr.onerror = () => {
loadingText.textContent = 'Yükleme Başarısız.';
};
xhr.send(formData);
});
function copyToClipboard(url) {
navigator.clipboard.writeText(url).then(() => alert('Link kopyalandı!'));
}
</script>
</body>
</html>
