以编辑多数据形式上传文件
Upload File in Edit Multiple Data Form
我正在尝试使用 Laravel 8 创建编辑多数据表单 like this。在表单中,您只能为每一行上传一个文件。我可以在不上传文件的情况下更新数据,但是当我尝试更新文件时,它会将我重定向回表单并且没有上传文件。我已经将 enctype 添加到我的表单中。这是我的代码:
查看:
<div class="custom-file" style="margin-left:10px; margin-right:10px;">
<input type="file" name="bukti[]" class="custom-file-input">
<label class="custom-file-label"></label>
</div>
控制器:
if($request->file('bukti') !=null) {
//upload file
$bukti=array();
if($files=$request->file('bukti')) {
foreach($files as $file) {
$name=$file->getClientOriginalName();
$path=$file->storeAs('blabla',$name);
$bukti[]=$name;
}
}
//Update multiple data
if(count($request->id) > 0) {
foreach($request->id as $item => $v) {
$data = array(
'id_laporan' => $laporan_indikators->id,
'id_pertanyaan' => $request->id_pertanyaan[$item],
'jumlah' => $request->jumlah[$item],
'keterangan' => $request->keterangan[$item],
'bukti' => $bukti[$item],
);
$data_laporans = DataLaporan::where('id',$request->id[$item])->first();
$data_laporans->update($data);
}
}
我已经尝试修复它,但仍然没有得到解决方案。请帮助我,因为我还是个初学者。我很抱歉我的英语不好。谢谢。
更新:我已经尝试将代码更新为如下内容:
控制器:
//upload file
if($files=$request->file('bukti')) {
foreach($files as $file) {
$name=$file->hashName();
$path=$file->storeAs('blabla',$name);
$bukti=$name;
}
}
//Update multiple data
if(count($request->id) > 0) {
foreach($request->id as $item => $v) {
$data = array(
'id_laporan' => $laporan_indikators->id,
'id_pertanyaan' => $request->id_pertanyaan[$item],
'jumlah' => $request->jumlah[$item],
'keterangan' => $request->keterangan[$item],
'bukti' => $bukti,
);
$data_laporans = DataLaporan::where('id',$request->id[$item])->first();
$data_laporans->update($data);
}
}
它上传文件并在更新成功后将我重定向回索引页面,但是当我检查数据库时,控制器将所有 bukti 列值更新为相同的文件名。如果我尝试更新两行文件,则所有 bukti 列只是将值更新为上次上传的文件名。我想要的是连续只有一个 jumlah、keterangan 和一个 bukti 文件的数据,因此我可以为每一行设置不同的文件。我真的不知道如何解决这个问题,因为我还是个初学者。感谢您的帮助。
尝试添加双问号(??)检查数组索引是否可用:
<?php
if($request->file('bukti') !=null) {
//upload file
$bukti=array();
if($files=$request->file('bukti')) {
foreach($files as $file) {
$name=$file->getClientOriginalName();
$path=$file->storeAs('blabla',$name);
$bukti[]=$name;
}
}
//Update multiple data
if(count($request->id) > 0) {
foreach($request->id as $item => $v) {
$data = array(
'id_laporan' => $laporan_indikators->id,
'id_pertanyaan' => $request->id_pertanyaan[$item],
'jumlah' => $request->jumlah[$item],
'keterangan' => $request->keterangan[$item],
'bukti' => $bukti[$item] ?? '',
);
$data_laporans = DataLaporan::where('id',$request->id[$item])->first();
$data_laporans->update($data);
}
}
经过多次尝试,终于找到了解决办法。其实我只需要给出一个文件是否在某行上传的条件即可。
查看:
<div class="custom-file" style="margin-left:10px; margin-right:10px;">
<input type="file" name="bukti_{{ $data->id }}" class="custom-file-input">
<label class="custom-file-label"></label>
</div>
控制器:
if (count($request->id) > 0) {
$bukti = '';
foreach ($request->id as $item => $v) {
$id_item = $request->id[$item];
$file = $request->file('bukti_'.$id_item);
$data = array(
'id_laporan' => $laporan_indikators->id,
'id_pertanyaan' => $request->id_pertanyaan[$item],
'jumlah' => $request->jumlah[$item],
'keterangan' => $request->keterangan[$item],
);
//If file is updated
if ($file) {
$name = $file->hashName();
$path = $file->storeAs('blabla', $name);
$bukti = $name;
$data['bukti'] = $name;
}
$data_laporans = DataLaporan::where('id', $request->id[$item])->first();
$data_laporans->update($data);
}
}
我正在尝试使用 Laravel 8 创建编辑多数据表单 like this。在表单中,您只能为每一行上传一个文件。我可以在不上传文件的情况下更新数据,但是当我尝试更新文件时,它会将我重定向回表单并且没有上传文件。我已经将 enctype 添加到我的表单中。这是我的代码:
查看:
<div class="custom-file" style="margin-left:10px; margin-right:10px;">
<input type="file" name="bukti[]" class="custom-file-input">
<label class="custom-file-label"></label>
</div>
控制器:
if($request->file('bukti') !=null) {
//upload file
$bukti=array();
if($files=$request->file('bukti')) {
foreach($files as $file) {
$name=$file->getClientOriginalName();
$path=$file->storeAs('blabla',$name);
$bukti[]=$name;
}
}
//Update multiple data
if(count($request->id) > 0) {
foreach($request->id as $item => $v) {
$data = array(
'id_laporan' => $laporan_indikators->id,
'id_pertanyaan' => $request->id_pertanyaan[$item],
'jumlah' => $request->jumlah[$item],
'keterangan' => $request->keterangan[$item],
'bukti' => $bukti[$item],
);
$data_laporans = DataLaporan::where('id',$request->id[$item])->first();
$data_laporans->update($data);
}
}
我已经尝试修复它,但仍然没有得到解决方案。请帮助我,因为我还是个初学者。我很抱歉我的英语不好。谢谢。
更新:我已经尝试将代码更新为如下内容:
控制器:
//upload file
if($files=$request->file('bukti')) {
foreach($files as $file) {
$name=$file->hashName();
$path=$file->storeAs('blabla',$name);
$bukti=$name;
}
}
//Update multiple data
if(count($request->id) > 0) {
foreach($request->id as $item => $v) {
$data = array(
'id_laporan' => $laporan_indikators->id,
'id_pertanyaan' => $request->id_pertanyaan[$item],
'jumlah' => $request->jumlah[$item],
'keterangan' => $request->keterangan[$item],
'bukti' => $bukti,
);
$data_laporans = DataLaporan::where('id',$request->id[$item])->first();
$data_laporans->update($data);
}
}
它上传文件并在更新成功后将我重定向回索引页面,但是当我检查数据库时,控制器将所有 bukti 列值更新为相同的文件名。如果我尝试更新两行文件,则所有 bukti 列只是将值更新为上次上传的文件名。我想要的是连续只有一个 jumlah、keterangan 和一个 bukti 文件的数据,因此我可以为每一行设置不同的文件。我真的不知道如何解决这个问题,因为我还是个初学者。感谢您的帮助。
尝试添加双问号(??)检查数组索引是否可用:
<?php
if($request->file('bukti') !=null) {
//upload file
$bukti=array();
if($files=$request->file('bukti')) {
foreach($files as $file) {
$name=$file->getClientOriginalName();
$path=$file->storeAs('blabla',$name);
$bukti[]=$name;
}
}
//Update multiple data
if(count($request->id) > 0) {
foreach($request->id as $item => $v) {
$data = array(
'id_laporan' => $laporan_indikators->id,
'id_pertanyaan' => $request->id_pertanyaan[$item],
'jumlah' => $request->jumlah[$item],
'keterangan' => $request->keterangan[$item],
'bukti' => $bukti[$item] ?? '',
);
$data_laporans = DataLaporan::where('id',$request->id[$item])->first();
$data_laporans->update($data);
}
}
经过多次尝试,终于找到了解决办法。其实我只需要给出一个文件是否在某行上传的条件即可。
查看:
<div class="custom-file" style="margin-left:10px; margin-right:10px;">
<input type="file" name="bukti_{{ $data->id }}" class="custom-file-input">
<label class="custom-file-label"></label>
</div>
控制器:
if (count($request->id) > 0) {
$bukti = '';
foreach ($request->id as $item => $v) {
$id_item = $request->id[$item];
$file = $request->file('bukti_'.$id_item);
$data = array(
'id_laporan' => $laporan_indikators->id,
'id_pertanyaan' => $request->id_pertanyaan[$item],
'jumlah' => $request->jumlah[$item],
'keterangan' => $request->keterangan[$item],
);
//If file is updated
if ($file) {
$name = $file->hashName();
$path = $file->storeAs('blabla', $name);
$bukti = $name;
$data['bukti'] = $name;
}
$data_laporans = DataLaporan::where('id', $request->id[$item])->first();
$data_laporans->update($data);
}
}