1tomany/data-uri
Parse data URIs, base64 strings, plain text, URLs, or local files into a temporary file via an immutable value object. Auto-detect or override MIME type, set an optional display name, and the temp file is deleted automatically on destruct.
Installation:
composer require 1tomany/data-uri
First Use Case: Decode a base64-encoded image from a data URI in a Laravel controller:
use OneToMany\DataUri\DataDecoder;
public function handleImageUpload(Request $request)
{
$dataUri = $request->input('image_data_uri');
$file = DataDecoder::decode($dataUri, 'user_uploaded_image.png');
// Use the file (e.g., store it, process it)
$path = $file->getPathname();
// File auto-deletes when $file goes out of scope
}
Where to Look First:
DataDecoder::decode() for versatility.decode.php for practical use cases (e.g., handling URLs, base64, and text).DataUriInterface methods like getPathname(), getFormat(), and getClientName().$dataUri = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...';
$file = DataDecoder::decode($dataUri, 'custom_filename.png', 'image/png');
Storage facade for persistent storage:
Storage::put('uploads/' . $file->getClientName(), $file->getStream());
$url = 'https://example.com/image.jpg';
$file = DataDecoder::decode($url, 'remote_image.jpg');
Cache facade to avoid repeated downloads:
$cacheKey = 'remote_file_' . md5($url);
$file = Cache::remember($cacheKey, now()->addHours(1), function () use ($url) {
return DataDecoder::decode($url);
});
// Base64
$base64Data = 'SGVsbG8gV29ybGQ=';
$file = DataDecoder::decodeBase64($base64Data, 'text/plain', 'greeting.txt');
// Text
$text = "Hello, world!";
$file = DataDecoder::decodeText($text, 'message.txt');
decodeBase64() for API responses containing embedded assets (e.g., data:image/jpeg;base64,...):
$apiResponse = Http::get('https://api.example.com')->json();
$imageFile = DataDecoder::decodeBase64($apiResponse['image'], 'image/jpeg');
// File auto-deletes when $file is garbage collected
$file = DataDecoder::decode($dataUri);
// Process file...
// No need to manually delete
$file = DataDecoder::decode($dataUri);
// Process...
unset($file); // Force cleanup
$file = DataDecoder::decode($dataUri, null, 'text/markdown');
FileType enum for common types (e.g., FileType::Json):
use OneToMany\DataUri\FileType;
$file = DataDecoder::decode($dataUri, null, FileType::Json);
Wrap DataUriInterface in a FilesystemAdapter for seamless use with Laravel’s Storage facade:
use Illuminate\Contracts\Filesystem\FilesystemAdapter;
class DataUriAdapter implements FilesystemAdapter
{
public function writeStream($path, $resource, $options = [])
{
$file = DataDecoder::decode($resource);
return file_put_contents($path, $file->getStream());
}
// Implement other FilesystemAdapter methods...
}
Validate data URIs before decoding using Laravel’s Validator:
use Illuminate\Support\Facades\Validator;
$validator = Validator::make(['data_uri' => $dataUri], [
'data_uri' => 'required|url|mimes:data',
]);
Process data URIs in queues (e.g., for async storage):
class ProcessDataUriJob implements ShouldQueue
{
public function handle()
{
$file = DataDecoder::decode($this->dataUri);
Storage::put('processed/' . $file->getClientName(), $file->getStream());
}
}
Return decoded files as downloads:
return response()->stream(function () use ($file) {
echo $file->getStream();
}, 200, [
'Content-Type' => $file->getFormat(),
'Content-Disposition' => 'attachment; filename="' . $file->getClientName() . '"',
]);
Memory Limits:
memory_limit. For files >10MB, consider streaming directly to disk:
$tempPath = tempnam(sys_get_temp_dir(), 'data_uri_');
file_put_contents($tempPath, $dataUri);
$file = DataDecoder::decode($tempPath);
Filename Preservation:
$name is null, the package generates a random filename. Always pass a meaningful name for user-facing files:
// Bad: Random filename
$file = DataDecoder::decode($dataUri);
// Good: Preserve original name
$file = DataDecoder::decode($dataUri, 'user_uploaded.png');
MIME Type Conflicts:
mime_content_type()) may misclassify files. Explicitly set the type for critical files:
// Risky: Auto-detection
$file = DataDecoder::decode($dataUri);
// Safe: Explicit type
$file = DataDecoder::decode($dataUri, null, 'application/pdf');
Remote URL Issues:
Guzzle or Laravel’s Http client for pre-validation:
$response = Http::get($url);
$response->throw(); // Fail fast on invalid URLs
$file = DataDecoder::decode($url);
Garbage Collection Timing:
DataUriInterface object is garbage collected. For long-running scripts, manually unset the variable:
$file = DataDecoder::decode($dataUri);
// Process...
unset($file); // Force cleanup
Stream Resource Leaks:
DataUriInterface object is destroyed. Use stream_get_contents() or fpassthru():
$stream = $file->getStream();
$content = stream_get_contents($stream);
fclose($stream);
Inspect the DataUriInterface Object:
$file = DataDecoder::decode($dataUri);
dd([
'path' => $file->getPathname(),
'format' => $file->getFormat(),
'clientName' => $file->getClientName(),
'originalUri' => $file->getOriginalUri(), // Added in v6.0.7
]);
Check for Valid Data URIs:
if (!preg_match('/^data:[a-z]+\/[
How can I help you explore Laravel packages today?