168 lines
7.3 KiB
HTML
168 lines
7.3 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block title %}Upload Image - SEREACT Web Client{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="row justify-content-center">
|
|
<div class="col-md-8">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5 class="mb-0">
|
|
<i class="fas fa-upload"></i> Upload Image
|
|
</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<form method="POST" enctype="multipart/form-data">
|
|
<div class="mb-3">
|
|
<label for="file" class="form-label">
|
|
<i class="fas fa-file-image"></i> Select Image *
|
|
</label>
|
|
<input type="file" class="form-control" id="file" name="file"
|
|
accept="image/*" required>
|
|
<div class="form-text">
|
|
Supported formats: PNG, JPG, JPEG, GIF, BMP, WebP. Maximum size: 10MB.
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mb-3">
|
|
<label for="description" class="form-label">
|
|
<i class="fas fa-align-left"></i> Description
|
|
</label>
|
|
<textarea class="form-control" id="description" name="description"
|
|
rows="3" placeholder="Enter image description (optional)"></textarea>
|
|
<div class="form-text">
|
|
A description of what the image contains or represents
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mb-3">
|
|
<label for="tags" class="form-label">
|
|
<i class="fas fa-tags"></i> Tags
|
|
</label>
|
|
<input type="text" class="form-control" id="tags" name="tags"
|
|
placeholder="Enter tags separated by commas">
|
|
<div class="form-text">
|
|
Tags help organize and search for images. Example: nature, landscape, sunset
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mb-3">
|
|
<label for="collection_id" class="form-label">
|
|
<i class="fas fa-folder"></i> Collection ID (Optional)
|
|
</label>
|
|
<input type="text" class="form-control" id="collection_id" name="collection_id"
|
|
placeholder="Enter collection ID">
|
|
<div class="form-text">
|
|
Optional collection ID to group related images
|
|
</div>
|
|
</div>
|
|
|
|
<div class="d-grid gap-2 d-md-flex justify-content-md-end">
|
|
<a href="{{ url_for('images') }}" class="btn btn-secondary">
|
|
<i class="fas fa-arrow-left"></i> Back to Images
|
|
</a>
|
|
<button type="submit" class="btn btn-primary">
|
|
<i class="fas fa-upload"></i> Upload Image
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card mt-4">
|
|
<div class="card-header">
|
|
<h6 class="mb-0">
|
|
<i class="fas fa-info-circle"></i> Upload Information
|
|
</h6>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<h6><i class="fas fa-brain text-primary"></i> AI Processing</h6>
|
|
<ul class="small">
|
|
<li>Images are automatically processed with AI</li>
|
|
<li>Embeddings are generated for semantic search</li>
|
|
<li>Processing happens asynchronously in the background</li>
|
|
<li>You can search for images once processing is complete</li>
|
|
</ul>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<h6><i class="fas fa-cloud text-info"></i> Storage</h6>
|
|
<ul class="small">
|
|
<li>Images are securely stored in Google Cloud Storage</li>
|
|
<li>Access is controlled by team membership</li>
|
|
<li>Metadata is stored in the database</li>
|
|
<li>Original filenames and formats are preserved</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card mt-4">
|
|
<div class="card-header">
|
|
<h6 class="mb-0">
|
|
<i class="fas fa-lightbulb"></i> Tips for Better Results
|
|
</h6>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<h6><i class="fas fa-tags text-warning"></i> Tagging</h6>
|
|
<ul class="small">
|
|
<li>Use descriptive, specific tags</li>
|
|
<li>Include objects, colors, emotions, locations</li>
|
|
<li>Separate tags with commas</li>
|
|
<li>Use consistent naming conventions</li>
|
|
</ul>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<h6><i class="fas fa-search text-success"></i> Searchability</h6>
|
|
<ul class="small">
|
|
<li>Good descriptions improve search accuracy</li>
|
|
<li>Include context and important details</li>
|
|
<li>Mention people, objects, and activities</li>
|
|
<li>Use natural language descriptions</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
|
|
{% block scripts %}
|
|
<script>
|
|
// Preview selected image
|
|
document.getElementById('file').addEventListener('change', function(e) {
|
|
const file = e.target.files[0];
|
|
if (file) {
|
|
// Validate file size
|
|
const maxSize = 10 * 1024 * 1024; // 10MB
|
|
if (file.size > maxSize) {
|
|
alert('File size exceeds 10MB limit. Please choose a smaller image.');
|
|
this.value = '';
|
|
return;
|
|
}
|
|
|
|
// Show file info
|
|
const fileInfo = document.createElement('div');
|
|
fileInfo.className = 'alert alert-info mt-2';
|
|
fileInfo.innerHTML = `
|
|
<i class="fas fa-info-circle"></i>
|
|
<strong>Selected:</strong> ${file.name} (${(file.size / 1024 / 1024).toFixed(2)} MB)
|
|
`;
|
|
|
|
// Remove existing file info
|
|
const existingInfo = this.parentNode.querySelector('.alert');
|
|
if (existingInfo) {
|
|
existingInfo.remove();
|
|
}
|
|
|
|
// Add new file info
|
|
this.parentNode.appendChild(fileInfo);
|
|
}
|
|
});
|
|
</script>
|
|
{% endblock %} |