创建新的ImageRequest时,用户可以上传1个或多个文件(例如图像)作为附件。
我的目标是将附件保存在数据库中或至少保存下来,以便我知道哪些附件属于什么ImageRequest。而且显然我需要保存文件。
这简化了我的ImageRequest表的外观:
Schema::create('image_requests', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('user_id')->nullable();
$table->foreign('user_id')->references('id')->on('users');
$table->string('attachment')->nullable();
$table->timestamps();
});
这是我在表单中上传的文件。
<input
id="input-b3"
name="attachment[]"
type="file"
class="file"
multiple
data-show-upload="false"
data-show-caption="true"
data-msg-placeholder="Select {files} for upload..."
>
这是处理商店的逻辑:
private function createNewImageRequest(StoreImageRequestRequest $request)
{
// create new imagerequest
$imageRequest = new ImageRequest(
array_merge(
$request->all(),
['status' => self::STATUS_NEW]
)
);
// save new image request binded to the user
$imageRequest = Auth::user()->imageRequests()->save($imageRequest);
// save files
$request->file('attachment')->storeAs(
'attachments', $request->user()->id
);
return $imageRequest->id;
}
我收到以下错误:
数组到字符串的转换
这可能是因为我的列类型是字符串,并且我正在尝试保存一个数组,所以我需要对其进行序列化,但是我不知道我在做什么或是否可以工作。
从来没有想到将附件存储在Laraven中会如此困难,特别是因为Laravel使Web应用程序的基本操作变得相当容易。
答案 0 :(得分:0)
对于我的项目,我这样做并且在您的构造中起作用
$this->upload_path = 'img'.DIRECTORY_SEPARATOR.'blog'.DIRECTORY_SEPARATOR;
$this->storage = Storage::disk('public');
之后,在您的函数中使用以下代码:
// Uploading Image
if (array_key_exists('featured_image', $input)) {
$this->deleteOldFile($blog);
$input = $this->uploadImage($input);
}
这是deleteOldFile
public function deleteOldFile($model)
{
$fileName = $model->featured_image;
return $this->storage->delete($this->upload_path.$fileName);
}
和UploadImage
公共函数uploadImage($ input) { $ avatar = $ input ['featured_image'];
if (isset($input['featured_image']) && !empty($input['featured_image'])) {
$fileName = time().$avatar->getClientOriginalName();
$this->storage->put($this->upload_path.$fileName, file_get_contents($avatar->getRealPath()));
$input = array_merge($input, ['featured_image' => $fileName]);
return $input;
}
}