Paradox
1 سال پیش توسط Paradox مطرح شد
4 پاسخ

دخیره ویس و ارسال در پایگاه داده

سلام
یک سیستم چت با لاراول و لایووایر نوشتم که پیام ها در لحظه بین کاربران ارسال میشه
حالا میخوام ویس بین کاربران ارسال بشه
من ویس رو ضبط میکنم ولی توی مسیر 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',
        ],     ],

ثبت پرسش جدید
مهدی نظری
تخصص : توسعه دهنده Front End
@mahdi.nazari 1 سال پیش مطرح شد
0

سلام دوست من 🖐
امیدوارم حالت خوب و عالی باشی✨

مشکل اصلی که داری احتمالاً مربوط به مسیر ذخیره ویس‌ها در فایل‌سیستم و دیتابیس هستش. برای رفع این مشکل، به نکات زیر توجه کن:

  1. مسیر ذخیره ویس‌ها: در ابتدا، مچک کن که که مسیر ذخیره ویس‌ها به درستی تنظیم شده باشه. در فایل filesystems.php که در پیکربندی Laravel قرار داره، مسیری که شما به عنوان "uploads" تعریف کردی، باید به درستی به مسیر public اشاره کنه.

    باید مطمئن بشی که مسیر root به درستی به public اشاره داره، مانند:

    'root' => public_path('uploads'),
  2. ذخیره ویس در دیتابیس: پس از ذخیره مسیر فایل صوتی در سیستم فایل، باید اطلاعات مربوط به ویس (مثل مسیر آن) را در دیتابیس ذخیره کنی. در کدی که شما ارسال پیام انجام میدی، مشکلی به نظر نمییاد و به نظر می‌آید که مسیر صوتی به درستی در دیتابیس ذخیره میشع

  3. نمایش ویس: در قسمت نمایش پیام و ویس‌ها، مطمئن شو که شما مسیر ذخیره ویس را به درستی به عنوان منبع (src) در تگ <audio> اشاره دادی . به نظر می‌آید کد شما برای نمایش ویس درسته:

    @if ($message->audio_path)
    <audio src="{{ $message->audio_path }}" controls></audio>
    @else
    <p>{{ $message->body }}</p>
    @endif

اگر با توجه به این نکات همچنان مشکل داری ، لازمه به اطلاعات بیشتری در مورد خطا یا مشکلی که رخ داده ذکر کنی تا بتونم به شما کمک کامل‌تری ارائه بدم

امیدوارم پاسخم بهت کمک کرده باشه ❤️
موفق و پیروز باشی 🤘🌹


Paradox
تخصص : در حال یادگیری
@paradox 1 سال پیش مطرح شد
0

@mahdi.nazari
سلام ممنون از پاسختون
مواردی که فرمودید از قبل بررسی کردم و درسته مشکلی نداره
هیچ خطایی توی کنسول یا توی log پروژه وجود نداره
و نمیدونم دلیل اینکه فایل و مسیر فایل ذخیره نمیشه چیه
فایل ویس ضبط میشه ولی وقتی روی ارسال ویس میزنم توی پایگاه داده و مسیر پوشه پابلیک ذخیره نمیشه


مهدی نظری
تخصص : توسعه دهنده Front End
@mahdi.nazari 1 سال پیش مطرح شد
0

قربانت خواهش میکنم دوست من
بنظرم بهترین راه حل اینه که قسمت به قسمت ماجرا رو یه ریفکتور کنی خط به خط چک کنی و رویدادهایی که اتفاق میفته رو ترک و دنبال کنی اینطوری باگ کارو میتونی متوجه بشی و سریع تر به نتیجه میرسی 👍


Paradox
تخصص : در حال یادگیری
@paradox 1 سال پیش مطرح شد
0

متاسفانه موفق نشدم هنوز درست کنم
یک مشکلی که وجود داشت توی کدهام همزمان هم از طریق لایووایر هم جی اس برای ارسال فایل تلاش میکردم
چه از طریق لایووایر چه جی اس موفق نشدم فایل ارسال کنم و همچنان مشکل قبلی وجود داره

کسی مسلط به لایووایر نیست ؟؟


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام