2016-03-15 3 views
5

Ich benutze Laravel 5.1 und möchte ein Formular mit ein paar Zeilen von Textfeldern mit den entsprechenden Bild-Uploads haben.Laravel: Upload von Formulardaten mit Bildern in einer foreach-Schleife mit Intervention

Form:

<div id="row"> 
    <input name="description[]" type="text"> 
    <input name="image[]" type="file"> 
</div> 
<div id="row"> 
    <input name="description[]" type="text"> 
    <input name="image[]" type="file"> 
</div> 

Controller:

foreach($request->description as $key => $val){ 

if($val != null){ 
    $data = new Finding; 
    $data->description = $val; //save description for each loop 

    $file = array('image' => Input::file('image')); 

    if (Input::file('image')->isValid()) { 

     $destinationPath = 'uploads'; 
     $extension = Input::file('image')->getClientOriginalExtension(); 
     $fileName = rand(1000,1000).'.'.$extension; 
     Input::file('image')->move($destinationPath, $fileName); 
     $path = Input::file('image')->getRealPath(); 

     $data->image_location = $fileName[$key]; //save filename location to db 
     $data->save(); 

     flash('success', 'Uploaded Successful'); 
     return Redirect::to('/upload'); 
    } else { 
     flash('error', 'Uploaded File Is Not Valid'); 
     return Redirect::to('/upload'); 
    } 
} 

Meine Frage ist, wie verwende ich Eingriff mit dem $key Wert eine neue Zeile in der Tabelle mit der zugehörigen Textbeschreibung mit der speichern Bild hochladen und weiterhin alle Interventionsklassen verwenden? Ist mein Code geschlossen?

Ich kann dies leicht zu tun, alle mit nur einem Formulareingabe mit einem Bild-Upload, aber mein Ziel ist es, eine Seite mit mehreren Reihen mit Eingängen zu haben. Vielen Dank!

+0

Was ist Intervention? – haakym

+0

@haakym http://image.intervention.io/ –

Antwort

4

Ich bin nicht sicher, wie Sie die mehrere Felder sind die Verwaltung, sei es in Stein gemeißelt ist oder dynamisch ändern können. Ich habe vorher dynamische Ansätze mit Javascript gemacht und verfolgt, wie viele dynamische Felder ich mit einem versteckten Textfeld als Anzahl benötigt habe.

Mit diesem Ansatz Ihrer html wie folgt aussehen könnte:

<input name="imageAndDescriptionCount" type="hidden" value="2"> 
<div id="row"> 
    <input name="description[]" type="text"> 
    <input name="image[]" type="file"> 
</div> 
<div id="row"> 
    <input name="description[]" type="text"> 
    <input name="image[]" type="file"> 
</div> 

wir also hier zwei Bild- und Beschreibungsfelder sind jeweils und der Zähler bei 2.

gesetzt Wenn wir die einreichen bilden und Kasse die Anforderung über dd() es in etwa so aussehen würde:

"imageAndDescriptionCount" => "2" 
"description" => array:2 [▼ 
    0 => "description" 
    1 => "description" 
] 
    "image" => array:2 [▼ 
    0 => UploadedFile {#154 ▶} 
    1 => UploadedFile {#155 ▶} 
] 

Dieses dann setzt man sich gut für eine for-Schleife in Ihrem Controller:

$count = $request->get('imageAndDescriptionCount'); 
$description = $request->get('description'); // assign array of descriptions 
$image = $request->file('image'); // assign array of images 

// set upload path using https://laravel.com/docs/5.1/helpers#method-storage-path 
// make sure 'storage/uploads' exists first 
$destinationPath = storage_path . '/uploads'; 

for($i = 0; $i < $count; $i++) { 

    $data = new Finding; 
    $data->description = [$i]; 

    $file = $image[$i]; 

    if ($file->isValid()) { 
     $extension = $file->getClientOriginalExtension(); // file extension 
     $fileName = uniqid(). '.' .$extension; // file name with extension 
     $file->move($destinationPath, $fileName); // move file to our uploads path 

     $data->image_location = $fileName; 
     // or you could say $destinationPath . '/' . $fileName 
     $data->save(); 
    } else { 
     // handle error here 
    } 

} 

flash('success', 'Uploads Successful'); 
return Redirect::to('/upload'); 

Bitte beachten Sie, dass keine Nutzung der Interventions Bibliothek in Ihrem Code meines Wissens ist, und ich habe gerade geschrieben habe den Code den Upload durchzuführen. Ich hoffe das hilft dir!

bearbeiten

Wenn Sie wirklich wollen, eine foreach-Schleife verwenden, und Sie wissen, dass Sie eine Beschreibung für jedes Bild haben Sie werden es so machen kann (aber ich persönlich denke, einen Zähler mit einem besseren Ansatz ist

)
$descriptions = $request->get('description'); // assign array of descriptions 
$images = $request->file('image'); // assign array of images 

// loop through the descriptions array 
foreach($descriptions as $key => $val) { 

    // You can access the description like this 
    $val 
    // or this 
    $descriptions[$key] 

    // so naturally you can access the image like this: 
    $images[$key] 

} 

Sie können auch stattdessen überprüfen Sie die Zählung der Beschreibungen/Bilder und verwenden, die als Gegen eine Schleife durch:

$descriptions = $request->get('description'); 
$images = $request->file('image'); // assign array of images 

$descCount = count($descriptions); 
$imgCount = count($images); 

Wenn Sie jedoch ein anderes Layout haben, d. H. Sie haben keine Beschreibung für ein Bild, dann klären Sie bitte, da Sie einen anderen Ansatz wählen müssen.

+0

Danke für die gründliche Antwort. Während Ihre Antwort logisch ist die einzige Sache ist, dass ich auf dem HTML-Formular bin mit einer „Noch ein Bild hinzufügen“ Schaltfläche Funktion, die die 'Tabelle tr' so von der Steuerungsseite klont würde die Menge der Bilder mit Beschreibungen unbekannt sein, so bin ich m versuchen, mit der foreach-Schleife zu gehen, anstatt einer harten Zahl wie Sie vorgeschlagen haben –

+0

ich sage nicht, hart zu codieren es.Verwenden Sie den Zählerwert dynamisch, aktualisieren Sie den Wert beim Hinzufügen (klicken Sie auf die Schaltfläche "Ein anderes Bild hinzufügen") oder entfernen Sie eine Zeile mit Javascript. Ich nehme an, jedes Mal, wenn Sie eine Zeile hinzufügen, fügen Sie eine zusätzliche Beschreibung und ein zusätzliches Bild hinzu, sie kommen als Paar richtig? Also sollte es gut mit meinem Ansatz funktionieren Sie müssen nur den Code hinzufügen, um den Zählerwert zu aktualisieren. – haakym

+0

Das stimmt. Lass mich es versuchen –

Verwandte Themen