diff --git a/src/mainview/components/MessageWebView.qml b/src/mainview/components/MessageWebView.qml
index 50fddca9b111454222686e30907288255b934000..767710b09e7a46b536f166b9779e4e387e32911c 100644
--- a/src/mainview/components/MessageWebView.qml
+++ b/src/mainview/components/MessageWebView.qml
@@ -227,6 +227,10 @@ Rectangle {
             messageWebViewRect.messagesLoaded()
         }
 
+        function copyToDownloads(interactionId, displayName) {
+            MessagesAdapter.copyToDownloads(interactionId, displayName)
+        }
+
         function emitPasteKeyDetected() {
             MessagesAdapter.pasteKeyDetected()
         }
diff --git a/src/messagesadapter.cpp b/src/messagesadapter.cpp
index 618384d533af2aa47a67022f854737a00ae58115..f36293b5b865915f482027259095ff9c3bdb238d 100644
--- a/src/messagesadapter.cpp
+++ b/src/messagesadapter.cpp
@@ -28,6 +28,8 @@
 #include "utils.h"
 #include "webchathelpers.h"
 
+#include <api/datatransfermodel.h>
+
 #include <QApplication>
 #include <QClipboard>
 #include <QDesktopServices>
@@ -368,6 +370,18 @@ MessagesAdapter::retryInteraction(const QString& interactionId)
         ->retryInteraction(lrcInstance_->get_selectedConvUid(), interactionId);
 }
 
+void
+MessagesAdapter::copyToDownloads(const QString& interactionId, const QString& displayName)
+{
+    auto downloadDir = lrcInstance_->accountModel().downloadDirectory;
+    if (auto accInfo = &lrcInstance_->getCurrentAccountInfo())
+        accInfo->dataTransferModel->copyTo(lrcInstance_->getCurrentAccountId(),
+                                           lrcInstance_->get_selectedConvUid(),
+                                           interactionId,
+                                           downloadDir,
+                                           displayName);
+}
+
 void
 MessagesAdapter::setNewMessagesContent(const QString& path)
 {
diff --git a/src/messagesadapter.h b/src/messagesadapter.h
index 62ea73a6e8a2ba611f042d9732581236eceef12e..82017a3bbb542d604d5454afb3ab5bce624ae6c1 100644
--- a/src/messagesadapter.h
+++ b/src/messagesadapter.h
@@ -67,6 +67,7 @@ protected:
     Q_INVOKABLE void pasteKeyDetected();
     Q_INVOKABLE void onComposing(bool isComposing);
     Q_INVOKABLE void loadMessages(int n);
+    Q_INVOKABLE void copyToDownloads(const QString& interactionId, const QString& displayName);
 
     // Manually update draft when hiding message web view (Back to welcome page).
     Q_INVOKABLE void updateDraft();