diff --git a/.env.example b/.env.example
index f40b07c2a9b5ba7369281050f0da521f62bd95a9..afa7e9eed7289360bd7d898eecf607eb453423e5 100644
--- a/.env.example
+++ b/.env.example
@@ -1,6 +1,13 @@
 DATABASE_URL=
 JWT_SHARED_SECRET=
+EXPRESS_PORT=
+
+# services
+# SOAP
 SOAP_URL=
 SOAP_WS_URL=
 SOAP_API_KEY=
-EXPRESS_PORT=
\ No newline at end of file
+
+# PHP
+PHP_URL=
+PHP_API_KEY=
diff --git a/src/clients/php-client.ts b/src/clients/php-client.ts
new file mode 100644
index 0000000000000000000000000000000000000000..29d193bd526c800702d806f9a41cecf58637db29
--- /dev/null
+++ b/src/clients/php-client.ts
@@ -0,0 +1,56 @@
+import axios from "axios";
+
+const phpClient = async (url : string, method : string, data : any, is_multipart_form_data : boolean = false) : Promise<object> => {
+    const responseData : string = await phpRequest(url, method, data, is_multipart_form_data);
+    return phpResponseDataParser(responseData);
+}
+
+const phpRequest = async (
+    url : string,
+    method : string,
+    data : any,
+    is_multipart_form_data : boolean,
+) : Promise<string> => {
+    if (method === "GET") {
+        const response = await axios.get(
+            url,
+            {
+                params: data,
+            }
+        );
+        return response.data as string;
+    }
+    else if (method === "POST") {
+        const formData = new FormData();
+        if (is_multipart_form_data) {
+            // only accept 1 file
+            Object.keys(data).forEach((key) => {
+                (key !== "file") && formData.append(key, data[key]);
+            });
+            const blobFile = new Blob([data.file.buffer]);
+            formData.append("rest-file", blobFile, data.file.filename)
+        }
+
+        const response = await axios.post(
+            url,
+            is_multipart_form_data ? formData : data,
+            {
+                headers: {
+                    "Content-Type": is_multipart_form_data ? "multipart/form-data" : "application/json",
+                    "X-API-KEY": process.env.PHP_API_KEY
+                }
+            }
+        );
+        return response.data as string;
+    }
+    else {
+        throw new Error("Invalid method");
+    }
+}
+
+const phpResponseDataParser = (data : string) : object => {
+    console.log(data)
+    return JSON.parse("{}");
+}
+
+export default phpClient;
\ No newline at end of file
diff --git a/src/controllers/premium-album-controller.ts b/src/controllers/premium-album-controller.ts
index 0a27da6ebc386e87b17ad7c257ae72494b705d45..36595e5d942e933b415c570af386d4097468b6a6 100644
--- a/src/controllers/premium-album-controller.ts
+++ b/src/controllers/premium-album-controller.ts
@@ -3,6 +3,9 @@ import * as PremiumAlbumService from "../services/premium-album-service";
 import { generateResponse } from "../utils/response";
 import { StatusCodes } from "http-status-codes";
 import {ErrorType, StandardError} from "../errors/standard-error";
+import phpClient from "../clients/php-client";
+import * as path from "path";
+import {v4 as uuidv4} from 'uuid';
 
 const createPremiumAlbum = async (
   req: Request,
@@ -14,8 +17,20 @@ const createPremiumAlbum = async (
     if (!req.file) {
         throw new StandardError(ErrorType.FILE_NOT_VALID);
     }
-    data.coverFilename = req.file.filename;
+    // data.coverFilename = req.file.filename;
+    data.coverFilename = uuidv4() + path.extname(req.file.originalname);
     const responseData = await PremiumAlbumService.createPremiumAlbum(data);
+    await phpClient(
+        process.env.PHP_URL + "upload",
+        "POST",
+        {
+          file : {
+            filename: data.coverFilename,
+            buffer: req.file.buffer
+          }
+        },
+        true
+    )
     generateResponse(res, StatusCodes.OK, responseData);
   } catch (err) {
     next(err);
@@ -54,14 +69,33 @@ const updatePremiumAlbum = async (
     // @ts-ignore
     if (req.files && req.files[0]) {
       // eslint-disable-next-line @typescript-eslint/ban-ts-comment
-        // @ts-ignore
-      data.coverFilename = req.files[0].filename;
+      // @ts-ignore
+      data.coverFilename = uuidv4() + path.extname(req.files[0].originalname);
     }
 
     const updatedPremiumAlbum = await PremiumAlbumService.updatePremiumAlbum(
       data,
       premiumAlbumId,
     );
+    // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+    // @ts-ignore
+    if (req.files && req.files[0]) {
+      // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+      // @ts-ignore
+      await phpClient(
+          process.env.PHP_URL + "upload",
+          "POST",
+          {
+              file : {
+                  filename: data.coverFilename,
+                  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+                  // @ts-ignore
+                  buffer: req.files[0].buffer
+              }
+          },
+          true
+      )
+    }
     generateResponse(res, StatusCodes.OK, updatedPremiumAlbum);
   } catch (err) {
     next(err);
diff --git a/src/controllers/premium-song-controller.ts b/src/controllers/premium-song-controller.ts
index a1bf4b0415822c12d92af4d50afa7ba0ee8aaa3f..a39b534f0165c2bc19049dfa4abfe4c457035b9c 100644
--- a/src/controllers/premium-song-controller.ts
+++ b/src/controllers/premium-song-controller.ts
@@ -3,6 +3,9 @@ import * as PremiumSongService from "../services/premium-song-services"
 import { generateResponse } from "../utils/response";
 import { StatusCodes } from "http-status-codes";
 import {ErrorType, StandardError} from "../errors/standard-error";
+import phpClient from "../clients/php-client";
+import {v4 as uuidv4} from "uuid";
+import path from "path";
 
 const addNewSong = async (
     req: Request,
@@ -15,13 +18,24 @@ const addNewSong = async (
         if (!req.file) {
             throw new StandardError(ErrorType.FILE_NOT_VALID);
         }
-        data.audioFilename = req.file.filename;
+        data.audioFilename = uuidv4() + path.extname(req.file.originalname);
         data.songNumber = Number(data.songNumber);
         if (data.discNumber) {
             data.discNumber = Number(data.discNumber);
         }
         data.duration = Number(data.duration);
         const responseData = await PremiumSongService.addNewSong(data, premiumAlbumId);
+        await phpClient(
+            process.env.PHP_URL + "upload",
+            "POST",
+            {
+                file : {
+                    filename: data.audioFilename,
+                    buffer: req.file.buffer
+                }
+            },
+            true
+        )
         generateResponse(res, StatusCodes.OK, responseData);
     } catch (err) {
         next(err);
@@ -66,9 +80,28 @@ const updatePremiumSong = async (
         if (req.files && req.files[0]) {
             // eslint-disable-next-line @typescript-eslint/ban-ts-comment
             // @ts-ignore
-            data.audioFilename = req.files[0].filename;
+            data.audioFilename = uuidv4() + path.extname(req.files[0].originalname);
         }
         const responseData = await PremiumSongService.updatePremiumSong(data, premiumAlbumId, premiumSongId);
+        // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+        // @ts-ignore
+        if (req.files && req.files[0]) {
+            // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+            // @ts-ignore
+            await phpClient(
+                process.env.PHP_URL + "upload",
+                "POST",
+                {
+                    file : {
+                        filename: data.audioFilename,
+                        // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+                        // @ts-ignore
+                        buffer: req.files[0].buffer
+                    }
+                },
+                true
+            )
+        }
         generateResponse(res, StatusCodes.OK, responseData);
     } catch (err) {
         next(err);
diff --git a/src/routers/premium-song-router.ts b/src/routers/premium-song-router.ts
index 3b576034b5c9cb3dc7c455abdd93717afba1a2ad..bcaa9a6bbaa2ace9ddd723b4610ea695b4639c00 100644
--- a/src/routers/premium-song-router.ts
+++ b/src/routers/premium-song-router.ts
@@ -9,7 +9,7 @@ const premiumSongRouter: Router = express.Router();
 premiumSongRouter.post(
     "/api/premium-album/:premiumAlbumId",
     verifyToken,
-    uploadSong.single("songFile"),
+    uploadSong.single("audioFile"),
     PremiumSongController.addNewSong,
     handleStandardError,
 );
diff --git a/src/utils/file-processing.ts b/src/utils/file-processing.ts
index 0242eb9b2824b7879c121388627d0a2b8c74fdf7..897cc537addedef78729138a493744817b47f73c 100644
--- a/src/utils/file-processing.ts
+++ b/src/utils/file-processing.ts
@@ -1,17 +1,7 @@
-import * as path from 'path';
-import {v4 as uuidv4} from 'uuid';
 import multer from "multer";
 
 // https://github.com/expressjs/multer
-
-const storage = multer.diskStorage({
-  destination: function (req, file, cb) {
-    cb(null, "./storage/")
-  },
-  filename: function (req, file, cb) {
-    cb(null, uuidv4() + path.extname(file.originalname))
-  }
-})
+const storage = multer.memoryStorage();
 
 const uploadCover = multer({
   storage: storage,