Estoy tratando de enviar un archivo de video desde mi app en laravel mediante POST usando hacia una API,y me genera un error A 'contents' key is required e intentado todas las soluciones posibles y no encuentro la solucion.
Este es la funcion de mi controlador que recibe los datos de mi formulario POST.
public function store(Request $request)
{
$validated = $request->validate([
'nameVideo' => 'required|max:255',
'videoFile' => 'required|file|mimes:mp4,mov,avi|max:3072000',
'datePublication' => 'required|date',
'producer' => 'required|string|in:' . implode(',', $this->producers),
'selectArtist' => ['required', 'array', function ($attribute, $value, $fail) {
foreach ($value as $artist) {
if (!in_array($artist, $this->artists)) {
$fail("El valor $artist no es válido para el campo $attribute.");
}
}
}],
'selectCategories' => ['required', 'array', function ($attribute, $value, $fail) {
foreach ($value as $category) {
if (!in_array($category, $this->categories)) {
$fail("El valor $category no es válido para el campo $attribute.");
}
}
}],
'newCategories' => 'nullable|string',
'descriptionVideo' => 'nullable',
]);
//Las validaciones se hacen correctamente
$video = $request->file('videoFile');
$data = [
'nombreVideo' => $validated['nameVideo'],
'fechaPublicacion' => $validated['datePublication'],
'productora' => $validated['producer'],
'listadoArtistas' => $validated['selectArtist'], // Array de artistas seleccionados
'listadoCategorias' => $validated['selectCategories'], // Array de categorías seleccionadas
'descripcion' => $validated['descriptionVideo'],
];
// Enviar la solicitud HTTP con los datos del formulario y el video
$response = Http::timeout(900)->asMultipart()->withHeaders([
'Authorization' => 'Bearer ' . Session::get('api_token'),
'Accept' => 'application/json',
])
->attach('video', file_get_contents($video->getRealPath()), $video->getClientOriginalName())
->post($this->endpoint_url, $data);
return $this->handlerResponse($response, 'Error al enviar el video');
}
La api tiene que recibir un multipart/fom-data del tipo
String nombreVideo,
MultipartFile video,
Date fechaPublicacion,
String productora,
List<String> listadoArtistas,
List<String> listadoCategorias,
String descripcion
y recibo el error A 'contents' key is required
Hola Luis,
Por empezar, imagino que ya lo hiciste pero tendrías que asegurarte que file_get_contents te está devolviendo correctamente el contenido del archivo:
dd(file_get_contents($video->getRealPath());
En segundo lugar, aparentemente en algunas versiones si enviás un archivo adjunto entonces no podés enviar los datos en la manera que lo estás haciendo. Y en su lugar tendrías que definirlos de esta manera:
$data = [
[
'name' => 'nombreVideo'
'contents' => $validated['nameVideo'],
],
[
'name' => 'fechaPublicacion'
'contents' => $validated['datePublication'],
],
[
'name' => 'productora'
'contents' => $validated['producer'],
],
[
'name' => 'listadoArtistas'
'contents' => $validated['selectArtist'], // Array de artistas seleccionados
],
[
'name' => 'listadoCategorias'
'contents' => $validated['selectCategories'], // Array de categorías seleccionadas
],
[
'name' => 'descripcion'
'contents' => $validated['descriptionVideo'],
],
[
'name' => 'video',
'contents' => file_get_contents($video->getRealPath()),
'filename' => $video->getClientOriginalName()
]
];
Y luego enviarlo como lo estabas haciendo pero sin el attach:
$response = Http::timeout(900)->asMultipart()->withHeaders([
'Authorization' => 'Bearer ' . Session::get('api_token'),
'Accept' => 'application/json',
])
->post($this->endpoint_url, $data);
Espero que te sirva. Saludos,