سلام
یک سیستم چت با لاراول و لایووایر نوشتم که پیام ها در لحظه بین کاربران ارسال میشه
حالا میخوام ویس بین کاربران ارسال بشه
من ویس رو ضبط میکنم ولی توی مسیر public ذخیره نمیشه و در دیتابیس هم ذخیره نمیشه
کدهای من
لطفا اگر کسی میدونه مشکل کجاست راهنمایی کنه
table
Schema::create('messages', function (Blueprint $table) {
$table->id();
$table->foreignId('conversation_id')->constrained()->onDelete('cascade');
$table->unsignedBigInteger('sender_id');
$table->foreign('sender_id')->references('id')->on('users')->onDelete('cascade');
$table->unsignedBigInteger('receiver_id');
$table->foreign('receiver_id')->references('id')->on('users')->onDelete('cascade');
$table->boolean('read')->default(0)->nullable();
$table->text('body')->nullable();
$table->string('audio_path')->nullable();
$table->string('type')->nullable();
$table->timestamps();
});
component
public function SendMessage(Request $request)
{
if ($this->body == null && $this->audioFile == null) {
return null;
}
$audioPath = null;
if ($request->hasFile('audioFile')) {
$audioFile = $request->file('audioFile');
$audioPath = $audioFile->store('uploads', 'public');
}
$this->createdMessage = Message::create([
'conversation_id' => $this->selectedConversation->id,
'sender_id' => auth()->id(),
'receiver_id' => $this->receiverInstance->id,
'body' => $this->body,
'audio_path' => $audioPath,
]);
$this->selectedConversation->last_time_message = $this->createdMessage->created_at;
$this->selectedConversation->save();
$this->emitTo('chat.chatbox', 'pushMessage', $this->createdMessage->id);
$this->emitTo('chat.chat-list', 'refresh');
$this->reset(['body', 'audioBlob']);
$this->emitSelf('dispatchMessageSent');
}
form
<form wire:submit.prevent="SendMessage" enctype="multipart/form-data">
@csrf
<div class="d-flex">
<button type="submit" class="border-0 mt-2 me-3 fs-5 send-msg-button">
<i class="fa fa-paper-plane" aria-hidden="true"></i>
</button>
<input wire:model="body" type="text" class="form-control send-msg-input" placeholder="پیام خود را بنویسید ...">
<div>
<button class="record-button border-0 mt-2 ms-3 fs-5" id="recordButton" onclick="toggleRecording()">
<i class="fa fa-microphone"></i>
</button>
<button class="record-button border-0 mt-2 ms-3 fs-5" id="stopButton" onclick="stopRecording()">
<i class="fa fa-stop"></i>
</button>
</div>
<div>
<audio id="recordedAudio" controls></audio>
<button id="sendButton" class="border-0" onclick="sendAudio()">ارسال</button>
</div>
</div>
<input type="file" id="audioFile" wire:model="audioFile" accept="audio/*" style="display:none">
</form>
script
<script>
var recorder;
var audioBlob;
function toggleRecording() {
var recordButton = document.getElementById('recordButton');
var stopButton = document.getElementById('stopButton');
if (recorder && recorder.state === 'recording') {
recorder.stopRecording();
stopButton.disabled = true;
recordButton.disabled = false;
} else {
navigator.mediaDevices.getUserMedia({audio: true})
.then(function (stream) {
recorder = RecordRTC(stream, {type: 'audio'});
recorder.startRecording();
stopButton.disabled = true;
recordButton.disabled = true;
})
.catch(function (error) {console.error('Could not get user media: ', error);});
}
}
function stopRecording() {
var recordedAudio = document.getElementById('recordedAudio');
var sendButton = document.getElementById('sendButton');
recorder.stopRecording(function () {
audioBlob = recorder.getBlob();
recordedAudio.src = URL.createObjectURL(audioBlob);
recordedAudio.play();
stopButton.disabled = true;
recordButton.disabled = false;
sendButton.disabled = false;
});
}
function sendAudio() {
let formData = new FormData();
formData.append('_token', document.querySelector('meta[name="csrf-token"]').content);
formData.append('audioFile', audioBlob);
Livewire.emit('chatbox.sendMessage', formData);
}
</script>
view message and voice
@if ($message->audio_path)
<audio src="{{ $message->audio_path }}" controls></audio>
@else
<p>{{ $message->body }}</p>
@endif
filesystem
اینجا روی هاست بردم مسیرشو به public_html تغییر دادم
'uploads' => [
'driver' => 'local',
'root' => base_path() . '/' . '/public_html/uploads',
'url' => env('APP_URL') . '/uploads',
], ],
سلام دوست من 🖐
امیدوارم حالت خوب و عالی باشی✨
مشکل اصلی که داری احتمالاً مربوط به مسیر ذخیره ویسها در فایلسیستم و دیتابیس هستش. برای رفع این مشکل، به نکات زیر توجه کن:
مسیر ذخیره ویسها: در ابتدا، مچک کن که که مسیر ذخیره ویسها به درستی تنظیم شده باشه. در فایل filesystems.php
که در پیکربندی Laravel قرار داره، مسیری که شما به عنوان "uploads"
تعریف کردی، باید به درستی به مسیر public
اشاره کنه.
باید مطمئن بشی که مسیر root
به درستی به public
اشاره داره، مانند:
'root' => public_path('uploads'),
ذخیره ویس در دیتابیس: پس از ذخیره مسیر فایل صوتی در سیستم فایل، باید اطلاعات مربوط به ویس (مثل مسیر آن) را در دیتابیس ذخیره کنی. در کدی که شما ارسال پیام انجام میدی، مشکلی به نظر نمییاد و به نظر میآید که مسیر صوتی به درستی در دیتابیس ذخیره میشع
نمایش ویس: در قسمت نمایش پیام و ویسها، مطمئن شو که شما مسیر ذخیره ویس را به درستی به عنوان منبع (src
) در تگ <audio>
اشاره دادی . به نظر میآید کد شما برای نمایش ویس درسته:
@if ($message->audio_path)
<audio src="{{ $message->audio_path }}" controls></audio>
@else
<p>{{ $message->body }}</p>
@endif
اگر با توجه به این نکات همچنان مشکل داری ، لازمه به اطلاعات بیشتری در مورد خطا یا مشکلی که رخ داده ذکر کنی تا بتونم به شما کمک کاملتری ارائه بدم
امیدوارم پاسخم بهت کمک کرده باشه ❤️
موفق و پیروز باشی 🤘🌹
@mahdi.nazari
سلام ممنون از پاسختون
مواردی که فرمودید از قبل بررسی کردم و درسته مشکلی نداره
هیچ خطایی توی کنسول یا توی log پروژه وجود نداره
و نمیدونم دلیل اینکه فایل و مسیر فایل ذخیره نمیشه چیه
فایل ویس ضبط میشه ولی وقتی روی ارسال ویس میزنم توی پایگاه داده و مسیر پوشه پابلیک ذخیره نمیشه
قربانت خواهش میکنم دوست من
بنظرم بهترین راه حل اینه که قسمت به قسمت ماجرا رو یه ریفکتور کنی خط به خط چک کنی و رویدادهایی که اتفاق میفته رو ترک و دنبال کنی اینطوری باگ کارو میتونی متوجه بشی و سریع تر به نتیجه میرسی 👍
متاسفانه موفق نشدم هنوز درست کنم
یک مشکلی که وجود داشت توی کدهام همزمان هم از طریق لایووایر هم جی اس برای ارسال فایل تلاش میکردم
چه از طریق لایووایر چه جی اس موفق نشدم فایل ارسال کنم و همچنان مشکل قبلی وجود داره
کسی مسلط به لایووایر نیست ؟؟
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟