How to use PUT method in Laravel API with File Upload

Stefan Bogdanescu

Founder & Senior Architect · 2026-06-29

Laravel Company
# Mastering File Uploads with the `PUT` Method in Laravel APIs When building RESTful APIs with Laravel, understanding the nuances between HTTP methods like `POST`, `PUT`, and `PATCH` is fundamental. As you noted in your query, the confusion often arises when mixing standard data updates with file uploads. This guide will walk you through the correct way to use the `PUT` method for updating resources that include files, ensuring your API endpoints are robust, predictable, and secure. ## Understanding PUT Semantics in REST APIs The HTTP `PUT` method is designed for **complete replacement** of a resource located at a specific URI. Unlike `POST`, which typically creates a new resource, `PUT` implies that you are sending the *entire* updated representation of the resource to the server. When performing an update via `PUT`, the request body must contain all the necessary data for the resource, including any new file attachments. This contrasts with `PATCH`, which is used for **partial updates** (only sending the fields you wish to change). For file uploads, this full replacement strategy works perfectly when you intend to replace the existing associated files entirely. ## The Challenge of File Uploads and Request Types The core difficulty often lies in how data serialization interacts with file transmission. Standard form submissions use `application/x-www-form-urlencoded`, which is excellent for simple text fields but fundamentally cannot handle binary file data. To upload files, you *must* use the `multipart/form-data` encoding type. When using `multipart/form-data` within a Laravel controller, the request object handles the separation of standard form fields and file streams internally. The confusion about `$request->all()` being null often stems from trying to retrieve simple text fields when the primary payload is file-based. ## Implementing PUT for Resource Updates with Files To successfully use `PUT` for updating a resource that includes a file, you need to ensure your client sends the request as `multipart/form-data`. In your Laravel controller, you leverage the `request()->file()` method to access the uploaded files directly. Here is a practical example demonstrating how to handle an update request where a user updates their profile and uploads a new passport image: ```php use Illuminate\Http\Request; use App\Models\Student; class StudentController extends Controller { public function update(Request $request, $studentId) { // 1. Find the existing resource $student = Student::findOrFail($studentId); // 2. Update standard fields (if provided) $student->username = $request->input('username', $student->username); $student->email = $request->input('email', $student->email); // Note: Password handling should involve hashing! // 3. Handle File Uploads using request()->file() // Assuming the file input field name is 'passport' if ($request->hasFile('passport')) { // Store the new file on the disk $path = $request->file('passport')->store('student_passports'); // Update the database record with the new file path $student->passport_path = $path; $student->save(); } else { // Handle case where no file was uploaded (optional) return response()->json(['message' => 'No file provided for update.'], 400); } return response()->json(['message' => 'Student updated successfully', 'student' => $student]); } } ``` ### Key Takeaways and Best Practices 1. **Request Type is Crucial:** Always ensure your client sends the request with `Content-Type: multipart/form-data` when uploading files, regardless of whether you are using `PUT` or `POST`. 2. **Use `request()->file()`:** This Eloquent pattern is the correct way to access uploaded files in Laravel. It abstracts the complexity of parsing the multi-part request for you. 3. **PUT vs. PATCH for Files:** If the client is replacing *all* associated files (e.g., replacing a user's entire profile picture set), `PUT` is appropriate. If you only want to update one field while keeping existing files, use `PATCH`. By adhering to these principles—understanding HTTP semantics and correctly utilizing Laravel’s request handling methods like `file()`—you can build complex, file-handling endpoints reliably. For deeper insights into Eloquent relationships and API design within the Laravel ecosystem, always refer to the official documentation at [laravelcompany.com](https://laravelcompany.com).