我有一个表格来更新我的新闻文章,在同一页上有标题、内容和图片上传按钮。图像上传程序使用Kartik FileINput小部件,用于应用Ajax方法的Yii2。
这是我处理AJAX上传的actionUpload
public function actionUpload($id)
{
$model = $this->findModel($id);
$currentImage=$model->image;
if (Yii::$app->request->isAjax)
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$image = $model->uploadImage();
if($image===false)
{
//echo "image instance is empty";
$model->image = $currentImage;
}
if ($model->validate() && $model->save())
{
if($image !== false)
{
$model->image = $image->basename.'.'.$image->extension;
$image->saveAs('uploads/batam/'.$model->image);
$model->save(false);
return \yii\helpers\Json::encode(array("image" => $model->image,
));
}
}
else
{echo "validation failed";}
}
}
这是我表单中的widget文件上传文件(注意:它在活动表单中)
echo FileInput::widget([
'name' => 'image',
'options'=>[
'multiple'=>false
],
'pluginOptions' => [
'uploadUrl' => Url::to(['news/upload','id'=>$id]),
'uploadExtraData' => [
'id'=>$id,
],
'initialPreview'=>[
Yii::getAlias('@web').'/uploads/batam'.$model->image
],
'initialPreviewAsData'=>true,
'overwriteInitial'=>false,
'maxFileSize'=>2800
]
]);
这是我的模型规则和上传图像方法
public function rules()
{
return [
[['title', 'content'], 'required'],
[['content'], 'string'],
[['created_at', 'updated_at'], 'safe'],
[['image'], 'file','skipOnEmpty'=>true, 'extensions'=>'jpg,png,jpeg'],
[['title'], 'string', 'max' => 255],
];
}
public function uploadImage() {
$image = UploadedFile::getInstanceByName('image');
if (empty($image)) {
return false;
}
return $image;
}
我这里有两个问题需要帮助:1。验证规则不起作用。我可以上传任何扩展名的文件,并成功上传和更新到数据库2中。图像上传包含在活动表单中,因此在使用AJAX成功上传后,当我按下“更新”按钮时,图像将不会显示。image
字段被视为空,因此update
按钮的行为就像我更新了一个空图像一样。在我的数据库中,已成功存储了受尊重的新闻id
的AJAX上载文件的图像路径,并上载了该文件。如何解决这个问题?事实上,我不介意上传方法没有使用AJAX,而是使用普通的单表单提交方法,使用post
,因此省略了upload
AJAX按钮,但根据Kartik纪录片,如果我想使用显示先前存储的图像的小部件,它需要AJAX。
我在StackOverflow等中查看了一些类似的问题,但是他们都有Ajax调用方法中空映像实例的问题(我以前也遇到过同样的问题,但是我在研究之后在Ajax上应用了Formdata),而我在Ajax调用中没有空实例的问题,但正常表单提交上的实例为空。
这是我的行动更新
public function actionUpdate($id)
{
$model = $this->findModel($id);
$image= UploadedFile::getInstanceByName('image');
if ($model->load(Yii::$app->request->post()) && $model->save() ){
var_dump($image);exit();
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('update', [
'model' => $model,
]);
}
}
提前感谢!
首先,验证器不工作的原因是因为你没有从模型中创建文件输入小部件,你必须这样做,以便你的规则在类模型中工作:
echo $form->field($model, 'image')->widget(FileInput::classname(), [
'options' => ['accept' => 'image/*'],
]);
然后我不知道你的数据库的结构如何,但我对如何处理图像上传的建议。首先,在与数据库的图像字段分离的类中创建一个公共变量,这个公共图像变量将是在表单上实例化小部件的变量,也是具有规则的变量。这样,当您发布表单时,数据库中的图像字段不会被过度压缩。
因此,当您使用ajax上传时,您也将发送对象的id,并且在upload函数中,一旦设置了所有内容,您将在数据库的image字段中存储路径、图像或其他内容。
问题内容: 我无法通过ajax上传多个文件。这是我的代码。 HTML代码: Ajax代码:- 当我通过Ajax调用upload_business_photo_do()函数时,它无法获取图像$ _FILES [‘file’] [‘name’]的名称 问题答案: 尝试这样使用,它简单又容易 并在控制器中使用像这样 并使用此功能将文件数据转换为多个图像数据的数组 它的工作完美,只需尝试使用它。您无需使用
问题内容: 我用来更新AJAX成功函数中的Label值,如下所示,但是我需要知道如何应用此方法来更改/更新广告的“ src” 问题答案: 使用jQuery,您可以使用像 假设您的回应是这样的,
问题内容: 我发现用AJAX上传图像似乎不符合表单中指定的multipart,因为我检查它是否为multipart()的代码从不起作用(在Java中)。 我有这个HTML表单: 以下是我的Ajax代码,该代码将图像发送到地址处的上传处理程序。我的Java代码中的uploadPost()方法首先确定上传是否为多部分,但是,似乎ajax不会将图像作为多部分发送。是否因为我在表单上使用了jQuery的s
问题内容: 我发现用AJAX上传图像似乎不符合表单中指定的multipart,因为我检查它是否为multipart()的代码从不工作(在Java中)。 我有这个HTML表单: 以下是我的ajax代码,该代码将图像发送到地址处的上传处理程序。我的Java代码中的uploadPost()方法首先确定上传是否为多部分,但是,似乎ajax不会将图像作为多部分发送。是否因为我在表单上使用了jQuery的se
问题内容: 我对jQuery和Ajax函数还比较陌生,但是过去几天一直在使用Ajax表单。我在尝试上传图像时遇到文件上传问题。在寻找资源时,我找不到任何有用的东西,因为它们似乎过于复杂,毫无意义,没有任何解释,这无助于我进一步学习。 我已经编写了以下代码来处理Ajax中的图片上传: 这向文件发送了一个请求,但是没有发送数据,基本上我的表单实际上是这样的: 似乎没有任何数据在标头中传递,我认为我将通
大家好,我想通过Retrofit2发布图像和其他数据。我在用一张图像发送数据。 所有其他信息都在储存,但我的图像不存储。当我用邮递员测试时,它工作。 请指导我在代码中的不足之处 这是我获取数据的代码 我甚至把它放在一个视图上,这很有效...