Yii2-视图在提交 excel 文件后给我错误
Yii2- view gives me error after submitting an excel file
我正在研究 Yii2
。我正在导入一个 excel 文件。在导入它时,我还发送了以前模型的 id
。过程如下
- 用户打开 GUI,select从下拉列表中输入一些值,然后单击创建按钮。
创建控制器
public function actionCreate()
{
$model = new MeterAcceptanceHeader();
$model->prepared_by = Yii::$app->user->id;
$model->prepared_at = date('Y-m-d H:i:s');
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['excel','id'=>$model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
点击下一步按钮后,用户将被提示进入一个新的 window,要求他上传一个 excel 文件。
Excel 控制器
public function actionExcel($id){
$file_name = "excel_" . Yii::$app->user->id . ".xlsx";
$error = "";
if(isset($_FILES['file'])) {
$path_parts = pathinfo($_FILES["file"]["name"]);
$extension = $path_parts['extension'];
if(!in_array($extension,['xlsx','xls'])){
$error = "Invalid file";
}else {
if (move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $file_name)) {
$this->redirect([
'process',
'file_name' => $file_name,
'header_no' => $_POST['header_no'],
'id'=>$id
]);
}
}
}
return $this->render("excel",['error'=>$error,'id'=>$id]);
}
Excel 查看
<div class="box-body">
<?php if($error != ""){?>
<div class="alert alert-danger"><?=$error?></div>
<?php } ?>
<form action="" method="post" enctype="multipart/form-data">
<input type="hidden" name="_csrf" value="<?= Yii::$app->request->getCsrfToken() ?>"/>
<input id="btn" class="form-control" type="file" name="file" />
<div class="form-group">
<br />
Header Row <br />
<select name="header_no" class="form-control">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
</select>
<br />
<input type="submit" value=" Next " class="btn btn-primary" />
</div>
</form>
</div>
上传 excel 文件后,用户将单击下一步按钮
- 现在 window 用户将被要求将 excel 字段映射到数据库字段
过程控制器
public function actionProcess(){
$file_name = $_GET['file_name'];
$id = $_GET['id'];
try {
$header_index = $_GET['header_no'];
$data = \moonland\phpexcel\Excel::widget([
'mode' => 'import',
'fileName' => 'uploads/' . $file_name,
'setFirstRecordAsKeys' => false, // if you want to set the keys of record column with first record, if it not set, the header with use the alphabet column on excel.
'setIndexSheetByName' => false, // set this if your excel data with multiple worksheet, the index of array will be set with the sheet name. If this not set, the index will use numeric.
'getOnlySheet' => 0, // you can set this property if you want to get the specified sheet from the excel data with multiple worksheet.
]);
if (isset($data[0])) {
$headers = $data[0][$header_index];
} else {
$headers = $data[$header_index];
}
}catch (Exception $x){
print_r($x->errorInfo);
}
return $this->render('excel_options',['headers'=>$headers,'file_name'=>$file_name,'header_index'=>$header_index,'id'=>$id]);
}
Excel 选项视图
<form action="import" method="post">
<input type="hidden" name="file_name" value="<?=$_GET['file_name']?>" />
<input type="hidden" name="header_index" value="<?= $_GET['header_no'] ?>"/>
<input type="hidden" name="model_id" value="<?= $_GET['id'] ?>"/>
<h1>Maping</h1>
<div class="row">
<div class="col-md-2">
Ref #:
</div>
<div class="col-md-4">
<label>
<select name="field[0][ref_no]" class="form-control">
<option value="">Select A field</option>
<?php foreach($headers as $k=>$v) { ?>
<?php if (trim($v) != '') { ?>
<option value="<?=$k?>"><?=$v?></option>
<?php } ?>
<?php } ?>
</select>
</label>
</div>
</div>
<div class="row">
<div class="col-md-2">
Meter MSN:
</div>
<div class="col-md-4">
<label>
<select name="field[0][meter_msn]" class="form-control">
<option value="">Select A field</option>
<?php foreach ($headers as $k => $v) { ?>
<?php if (trim($v) != '') { ?>
<option value="<?= $k ?>"><?= $v ?></option>
<?php } ?>
<?php } ?>
</select>
</label>
</div>
</div>
<div class="row">
<div class="col-md-2">
Meter Type:
</div>
<div class="col-md-4">
<label>
<select name="field[0][meter_type]" class="form-control">
<option value="">Select A field</option>
<?php foreach ($headers as $k => $v) { ?>
<?php if (trim($v) != '') { ?>
<option value="<?= $k ?>"><?= $v ?></option>
<?php } ?>
<?php } ?>
</select>
</label>
</div>
</div>
<div class="row">
<div class="col-md-2">
Sub-Div:
</div>
<div class="col-md-4">
<label>
<select name="field[0][sub_div]" class="form-control">
<option value="">Select A field</option>
<?php foreach ($headers as $k => $v) { ?>
<?php if (trim($v) != '') { ?>
<option value="<?= $k ?>"><?= $v ?></option>
<?php } ?>
<?php } ?>
</select>
</label>
</div>
</div>
<div class="row">
<div class="col-md-2"></div>
<div class="col-md-4">
<br />
<input type="submit" class="btn btn-primary pull-left" />
</div>
</div>
</form>
以上视图在process
动作控制器中调用。在这个视图中,我将模型 ID 作为隐藏字段传递。
映射文件并单击提交按钮后,文件中的数据将保存到数据库中。下面是将数据保存到数据库中的导入操作
public function actionImport()
{
$file_name = $_POST['file_name'];
$header_index = $_POST['header_index'];
$fieldSet = $_POST['field'];
$model_id = $_POST['model_id'];
print_r($model_id);
die();
.
.
.
return $this->render('excel_finish', ['records_saved' => $ok_count,'status_arr'=>$status_arr]);
}
到目前为止我做了什么
我能够 select 来自用户的数据(包括 excel 文件)。映射后,它应该进入导入操作,但我遇到了以下错误
Not Found (#404)
Page not found.
url: http://localhost:225/inventory-web/backend/web/meteracceptanceheader/process/import
更新 1
在浏览器中检查元素时,我可以看到 model id
。
我一定是做错了我不知道的事情。
非常感谢任何帮助。
你确定通过post$file_name = $_POST['file_name']
得到文件名吗???
只是尝试 var_dump($_FILE)
变量。
你会得到文件名$_FILES["file_name"]["name"]
通过使用这个。
此错误 "Not Found (#404) Page not found." 表示它无法解决您来自指定 URL 的请求。你的情况是:
http://localhost:225/inventory-web/backend/web/meteracceptanceheader/process/import
假设应该是这样的:
http://localhost:225/inventory-web/backend/web/meteracceptanceheader/import
查看本指南,了解如何在 Yii2 中处理请求,以及如何使用 'UrlHelper' 为您的应用生成网址。
我正在研究 Yii2
。我正在导入一个 excel 文件。在导入它时,我还发送了以前模型的 id
。过程如下
- 用户打开 GUI,select从下拉列表中输入一些值,然后单击创建按钮。
创建控制器
public function actionCreate()
{
$model = new MeterAcceptanceHeader();
$model->prepared_by = Yii::$app->user->id;
$model->prepared_at = date('Y-m-d H:i:s');
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['excel','id'=>$model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
点击下一步按钮后,用户将被提示进入一个新的 window,要求他上传一个 excel 文件。
Excel 控制器
public function actionExcel($id){ $file_name = "excel_" . Yii::$app->user->id . ".xlsx"; $error = ""; if(isset($_FILES['file'])) { $path_parts = pathinfo($_FILES["file"]["name"]); $extension = $path_parts['extension']; if(!in_array($extension,['xlsx','xls'])){ $error = "Invalid file"; }else { if (move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $file_name)) { $this->redirect([ 'process', 'file_name' => $file_name, 'header_no' => $_POST['header_no'], 'id'=>$id ]); } } } return $this->render("excel",['error'=>$error,'id'=>$id]); }
Excel 查看
<div class="box-body"> <?php if($error != ""){?> <div class="alert alert-danger"><?=$error?></div> <?php } ?> <form action="" method="post" enctype="multipart/form-data"> <input type="hidden" name="_csrf" value="<?= Yii::$app->request->getCsrfToken() ?>"/> <input id="btn" class="form-control" type="file" name="file" /> <div class="form-group"> <br /> Header Row <br /> <select name="header_no" class="form-control"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> </select> <br /> <input type="submit" value=" Next " class="btn btn-primary" /> </div> </form> </div>
上传 excel 文件后,用户将单击下一步按钮
- 现在 window 用户将被要求将 excel 字段映射到数据库字段
过程控制器
public function actionProcess(){
$file_name = $_GET['file_name'];
$id = $_GET['id'];
try {
$header_index = $_GET['header_no'];
$data = \moonland\phpexcel\Excel::widget([
'mode' => 'import',
'fileName' => 'uploads/' . $file_name,
'setFirstRecordAsKeys' => false, // if you want to set the keys of record column with first record, if it not set, the header with use the alphabet column on excel.
'setIndexSheetByName' => false, // set this if your excel data with multiple worksheet, the index of array will be set with the sheet name. If this not set, the index will use numeric.
'getOnlySheet' => 0, // you can set this property if you want to get the specified sheet from the excel data with multiple worksheet.
]);
if (isset($data[0])) {
$headers = $data[0][$header_index];
} else {
$headers = $data[$header_index];
}
}catch (Exception $x){
print_r($x->errorInfo);
}
return $this->render('excel_options',['headers'=>$headers,'file_name'=>$file_name,'header_index'=>$header_index,'id'=>$id]);
}
Excel 选项视图
<form action="import" method="post">
<input type="hidden" name="file_name" value="<?=$_GET['file_name']?>" />
<input type="hidden" name="header_index" value="<?= $_GET['header_no'] ?>"/>
<input type="hidden" name="model_id" value="<?= $_GET['id'] ?>"/>
<h1>Maping</h1>
<div class="row">
<div class="col-md-2">
Ref #:
</div>
<div class="col-md-4">
<label>
<select name="field[0][ref_no]" class="form-control">
<option value="">Select A field</option>
<?php foreach($headers as $k=>$v) { ?>
<?php if (trim($v) != '') { ?>
<option value="<?=$k?>"><?=$v?></option>
<?php } ?>
<?php } ?>
</select>
</label>
</div>
</div>
<div class="row">
<div class="col-md-2">
Meter MSN:
</div>
<div class="col-md-4">
<label>
<select name="field[0][meter_msn]" class="form-control">
<option value="">Select A field</option>
<?php foreach ($headers as $k => $v) { ?>
<?php if (trim($v) != '') { ?>
<option value="<?= $k ?>"><?= $v ?></option>
<?php } ?>
<?php } ?>
</select>
</label>
</div>
</div>
<div class="row">
<div class="col-md-2">
Meter Type:
</div>
<div class="col-md-4">
<label>
<select name="field[0][meter_type]" class="form-control">
<option value="">Select A field</option>
<?php foreach ($headers as $k => $v) { ?>
<?php if (trim($v) != '') { ?>
<option value="<?= $k ?>"><?= $v ?></option>
<?php } ?>
<?php } ?>
</select>
</label>
</div>
</div>
<div class="row">
<div class="col-md-2">
Sub-Div:
</div>
<div class="col-md-4">
<label>
<select name="field[0][sub_div]" class="form-control">
<option value="">Select A field</option>
<?php foreach ($headers as $k => $v) { ?>
<?php if (trim($v) != '') { ?>
<option value="<?= $k ?>"><?= $v ?></option>
<?php } ?>
<?php } ?>
</select>
</label>
</div>
</div>
<div class="row">
<div class="col-md-2"></div>
<div class="col-md-4">
<br />
<input type="submit" class="btn btn-primary pull-left" />
</div>
</div>
</form>
以上视图在process
动作控制器中调用。在这个视图中,我将模型 ID 作为隐藏字段传递。
映射文件并单击提交按钮后,文件中的数据将保存到数据库中。下面是将数据保存到数据库中的导入操作
public function actionImport() { $file_name = $_POST['file_name']; $header_index = $_POST['header_index']; $fieldSet = $_POST['field']; $model_id = $_POST['model_id']; print_r($model_id); die(); . . . return $this->render('excel_finish', ['records_saved' => $ok_count,'status_arr'=>$status_arr]); }
到目前为止我做了什么
我能够 select 来自用户的数据(包括 excel 文件)。映射后,它应该进入导入操作,但我遇到了以下错误
Not Found (#404) Page not found.
url: http://localhost:225/inventory-web/backend/web/meteracceptanceheader/process/import
更新 1
在浏览器中检查元素时,我可以看到 model id
。
我一定是做错了我不知道的事情。
非常感谢任何帮助。
你确定通过post$file_name = $_POST['file_name']
得到文件名吗???
只是尝试 var_dump($_FILE)
变量。
你会得到文件名$_FILES["file_name"]["name"]
通过使用这个。
此错误 "Not Found (#404) Page not found." 表示它无法解决您来自指定 URL 的请求。你的情况是:
http://localhost:225/inventory-web/backend/web/meteracceptanceheader/process/import
假设应该是这样的:
http://localhost:225/inventory-web/backend/web/meteracceptanceheader/import
查看本指南,了解如何在 Yii2 中处理请求,以及如何使用 'UrlHelper' 为您的应用生成网址。