> ## Documentation Index
> Fetch the complete documentation index at: https://www.ayrshare.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# تحميل ملفات وسائط كبيرة

> لتحميل الملفات الأكبر من 10 ميجابايت، احصل على عنوان URL موقّع مسبقًا لتحميل ملف

export const HeaderAPI = ({noProfileKey, profileKeyRequired}) => <>
    <ParamField header="Authorization" type="string" required>
      <a href="/apis/overview#authorization">API Key</a> of the Primary Profile.
      <br />
      <br />
      Format: <code>Authorization: Bearer API_KEY</code>
    </ParamField>
    {!noProfileKey && (profileKeyRequired ? <ParamField header="Profile-Key" type="string" required>
          <a href="/apis/overview#profile-key-format">Profile Key</a> of a User Profile.
          <br />
          <br />
          Format: <code>Profile-Key: PROFILE_KEY</code>
        </ParamField> : <ParamField header="Profile-Key" type="string">
          <a href="/apis/overview#profile-key-format">Profile Key</a> of a User Profile.
          <br />
          <br />
          Format: <code>Profile-Key: PROFILE_KEY</code>
        </ParamField>)}
  </>;

export const PlansAvailable = ({plans = [], maxPackRequired}) => {
  let displayPlans = plans;
  if (plans && plans.length === 1) {
    const lowerCasePlan = plans[0].toLowerCase();
    if (lowerCasePlan === "business") {
      displayPlans = ["Launch", "Business", "Enterprise"];
    } else if (lowerCasePlan === "premium") {
      displayPlans = ["Premium", "Launch", "Business", "Enterprise"];
    }
  }
  return <Note>
Available on {displayPlans.length === 1 ? "the " : ""}
{displayPlans.join(", ").replace(/\b\w/g, l => l.toUpperCase())}{" "}
{displayPlans.length > 1 ? "plans" : "plan"}.

{maxPackRequired && <span onClick={() => window.open('https://www.ayrshare.com/docs/additional/maxpack', '_self')} className="flex items-center mt-2 cursor-pointer">
 <span className="px-1.5 py-0.5 rounded text-sm" style={{
    backgroundColor: '#C264B6',
    color: 'white',
    fontSize: '12px'
  }}>
   Max Pack required
 </span>
</span>}
</Note>;
};

<PlansAvailable plans={["premium"]} maxPackRequired={false} />

لتحميل الملفات الأكبر من 10 ميجابايت، احصل على عنوان URL موقّع مسبقًا لتحميل ملف.

<ul class="custom-bullets">
  <li>الحد الأقصى لحجم تحميل الملف 5 جيجابايت.</li>
  <li>عنوان URL الموقّع مسبقًا للتحميل صالح لمدة 30 دقيقة بعد إنشائه.</li>

  <li>
    عنوان URL للوصول متاح لمدة 30 يومًا بعد التحميل. جميع المنشورات المُنشورة لا تتأثر على
    شبكات التواصل الاجتماعي. المنشورات المجدولة بعد ذلك الإطار الزمني ستؤدي إلى أخطاء عند وقت
    النشر.
  </li>
</ul>

<Tip>إذا كانت وسائطك متاحة بالفعل عبر عنوان URL خارجي، مثل حاوية S3، يمكنك تخطي تحميل الملفات إلى Ayrshare. ما عليك سوى POST إلى نقطة النهاية `/post` مع عنوان URL المتاح خارجيًا في معلمة الجسم `mediaURLs`، وسيتم تحميل ملفك تلقائيًا.</Tip>

## معلمات الترويسة

<HeaderAPI noProfileKey={true} />

## معلمات الاستعلام

<ParamField query="fileName" type="string">
  إذا لم يكن contentType موجودًا، فإن اسم ملف كامل مع الامتداد مطلوب.

  اسم الملف المراد تحميله. يجب أن يتضمن امتدادًا مثل .png، .jpg، .mov، .mp4، إلخ.
</ParamField>

<ParamField query="contentType" type="string">
  نوع المحتوى (content-type) للوسائط التي يتم تحميلها. الصيغ الصالحة تشمل: `mp4` و`mov` و`png` و`jpg` أو `jpeg`.

  على سبيل المثال، إذا كان الملف ملف Quicktime .mov، فيجب أن يكون contentType هو `mov`.

  إذا لم يكن موجودًا، سيتم استخدام application/octet-stream.
</ParamField>

<RequestExample>
  ```bash cURL theme={"system"}
  curl \
  -H "Authorization: Bearer [API Key]" \
  -X GET https://api.ayrshare.com/api/media/uploadUrl?fileName=test.mov&contentType=mov
  ```

  ```javascript JavaScript theme={"system"}
  const API_KEY = "Your API Key";

  fetch("https://api.ayrshare.com/api/media/uploadUrl?fileName=test.mov&contentType=mov", {
        method: "GET",
        headers: {
          "Authorization": `Bearer ${API_KEY}`
        }
      })
        .then((res) => res.json())
        .then((json) => console.log(json))
        .catch(console.error);
  ```

  ```python Python theme={"system"}
  import requests

  headers = {'Authorization': 'Bearer [API_KEY]'}

  r = requests.get('https://api.ayrshare.com/api/media/uploadUrl?fileName=test.mov&contentType=mov', headers=headers)

  print(r.json())
  ```

  ```php PHP theme={"system"}
  <?php
  require 'vendor/autoload.php';    // Composer auto-loader using Guzzle. See .../guzzlephp.org/en/stable/overview.html

  $client = new GuzzleHttp\Client();
  $res = $client->request(
      'GET',
      'https://api.ayrshare.com/api/media/uploadUrl?fileName=test.mov&contentType=mov',
      [
          'headers' => [
              'Content-Type'      => 'application/json',
              'Authorization'     => 'Bearer API_KEY'
          ]
      ]
  );

  echo json_encode(json_decode($res->getBody()), JSON_PRETTY_PRINT);
  ```

  ```csharp C# theme={"system"}
  using System;
  using System.Net.Http;
  using System.Threading.Tasks;
  using System.Web;

  namespace MediaUploadUrlGETRequest_csharp
  {
      class MediaUploadUrl
      {
          static async Task Main(string[] args)
          {
              string API_KEY = "API_KEY";
              string baseUrl = "https://api.ayrshare.com/api/media/uploadUrl";

              // Build URL with query parameters
              var uriBuilder = new UriBuilder(baseUrl);
              var query = HttpUtility.ParseQueryString(string.Empty);
              query["fileName"] = "test.mov";
              query["contentType"] = "mov";
              uriBuilder.Query = query.ToString();

              using (var client = new HttpClient())
              {
                  client.DefaultRequestHeaders.Add("Authorization", "Bearer " + API_KEY);

                  try
                  {
                      HttpResponseMessage response = await client.GetAsync(uriBuilder.Uri);
                      response.EnsureSuccessStatusCode();
                      string responseBody = await response.Content.ReadAsStringAsync();
                      Console.WriteLine(responseBody);
                  }
                  catch (HttpRequestException e)
                  {
                      Console.WriteLine($"Error: {e.Message}");
                  }
              }
          }
      }
  }
  ```
</RequestExample>

## تفاصيل الاستجابة

<ul class="custom-bullets">
  <li>`accessUrl` هو عنوان URL للوصول إلى ملف الوسائط بعد التحميل.</li>

  <li>
    `contentType` هو نوع المحتوى المُعيَّن للوسائط التي يتم تحميلها. استخدمه في ترويسة *Content-Type*
    عند تحميل الوسائط.
  </li>

  <li>`uploadUrl` هو عنوان URL المُستخدم لـ *PUT* ملف الوسائط. يرجى الاطلاع أدناه.</li>
</ul>

### أمثلة إضافية لنقطة النهاية

عملية تحميل الملفات الأكبر:

<ul class="custom-bullets">
  <li>
    احصل على `uploadURL` و`accessURL` عبر نقطة النهاية `/media/uploadUrl`. يرجى الاطلاع أعلاه.
  </li>

  <li>حمّل الملف عبر *PUT* مع تعيين *Content-Type* إلى `contentType` المُعاد.</li>
  <li>حمّل الوسائط باستخدام `--upload-file` مع ملف وسائط و`uploadUrl`.</li>
  <li>عند التحميل الناجح، ستُعاد استجابة `200`.</li>

  <li>
    بعد تحميل ملف الوسائط، POST إلى نقطة النهاية `/post` مع `accessUrl` في معلمة الجسم
    `mediaUrls`.
  </li>

  <li>
    **يمكن التحميل إلى عنوان URL الموقّع مسبقًا مرة واحدة فقط**. إذا أرسلت ملفًا سيئًا، يجب عليك
    إنشاء عنوان URL جديد للتحميل. لن تحدث استجابة خطأ إذا لم يتم تحميل الملف بنجاح.
    راجع أدناه [للتحقق من وجود عنوان URL](/apis/media/verify-media-url).
  </li>
</ul>

<CodeGroup>
  ```bash cURL theme={"system"}
  curl -X PUT \
  -H 'Content-Type: video/mp4' \
  --upload-file LOCAL_FILE_PATH uploadUrl
  ```

  ```javascript JavaScript theme={"system"}
  const fs = require("fs").promises;
  const uploadFileToSignedUrl = async (signedUrl, filePath) => {
      try {
        const fileBuffer = await fs.readFile(filePath);
        const response = await fetch(signedUrl, {
          method: "PUT",
          body: fileBuffer,
          headers: {
            "Content-Type": "video/mp4"
          }
        });

        if (response.ok) {
          console.log("File upload successful:", response.status);
        } else {
          console.error("File upload failed:", response.status);
        }
      } catch (error) {
        console.error("Error uploading file:", error);
      }
  };

  // Use the signed URL generated from the previous step
  const signedUrl = "SIGNED_URL";
  const filePath = "LOCAL_FILE_PATH";

  uploadFileToSignedUrl(signedUrl, filePath);
  ```

  ```python Python theme={"system"}
  import requests

  def upload_file_to_signed_url(signed_url, file_path):
      try:
          with open(file_path, 'rb') as file:
              response = requests.put(signed_url, data=file, headers={'Content-Type': 'video/mp4'})

          if response.ok:
              print("File upload successful:", response.status_code)
          else:
              print("File upload failed:", response.status_code)
      except Exception as error:
          print("Error uploading file:", error)

  # Use the signed URL generated from the previous step
  signed_url = "SIGNED_URL"
  file_path = "LOCAL_FILE_PATH"

  upload_file_to_signed_url(signed_url, file_path)
  ```

  ```php PHP theme={"system"}
  <?php

  function uploadFileToSignedUrl($signedUrl, $filePath) {
      try {
          $fileHandle = fopen($filePath, 'rb');
          if ($fileHandle === false) {
              throw new Exception('Cannot open the file');
          }

          $ch = curl_init($signedUrl);

          curl_setopt($ch, CURLOPT_PUT, true);
          curl_setopt($ch, CURLOPT_INFILE, $fileHandle);
          curl_setopt($ch, CURLOPT_INFILESIZE, filesize($filePath));
          curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: video/mp4'));
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

          $response = curl_exec($ch);
          $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

          if ($httpCode == 200) {
              echo "File upload successful: " . $httpCode;
          } else {
              echo "File upload failed: " . $httpCode;
          }

          fclose($fileHandle);
          curl_close($ch);
      } catch (Exception $e) {
          echo "Error uploading file: " . $e->getMessage();
      }
  }

  // Use the signed URL generated from the previous step
  $signedUrl = "SIGNED_URL";
  $filePath = "LOCAL_FILE_PATH";

  uploadFileToSignedUrl($signedUrl, $filePath);
  ?>

  ```

  ```csharp C# theme={"system"}
  using System;
  using System.Net.Http;
  using System.IO;
  using System.Threading.Tasks;

  class Program
  {
      static async Task Main(string[] args)
      {
          string signedUrl = "SIGNED_URL"; // Replace with your signed URL
          string filePath = "LOCAL_FILE_PATH"; // Replace with your file path

          try
          {
              await UploadFileToSignedUrl(signedUrl, filePath);
          }
          catch (Exception ex)
          {
              Console.WriteLine("Error uploading file: " + ex.Message);
          }
      }

      static async Task UploadFileToSignedUrl(string signedUrl, string filePath)
      {
          using (var client = new HttpClient())
          using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
          using (var content = new StreamContent(fileStream))
          {
              content.Headers.Add("Content-Type", "video/mp4");

              var response = await client.PutAsync(signedUrl, content);

              if (response.IsSuccessStatusCode)
              {
                  Console.WriteLine("File upload successful: " + response.StatusCode);
              }
              else
              {
                  Console.WriteLine("File upload failed: " + response.StatusCode);
              }
          }
      }
  }

  ```

  ```java Java theme={"system"}
  import java.net.URI;
  import java.net.http.HttpClient;
  import java.net.http.HttpRequest;
  import java.net.http.HttpResponse;
  import java.net.http.HttpRequest.BodyPublishers;
  import java.nio.file.Path;
  import java.io.IOException;
  import java.nio.file.Files;

  public class FileUploader {

      public static void main(String[] args) {
          String signedUrl = "SIGNED_URL"; // Replace with your signed URL
          String filePath = "LOCAL_FILE_PATH"; // Replace with your file path

          try {
              uploadFileToSignedUrl(signedUrl, filePath);
          } catch (IOException | InterruptedException e) {
              System.out.println("Error uploading file: " + e.getMessage());
          }
      }

      private static void uploadFileToSignedUrl(String signedUrl, String filePath) throws IOException, InterruptedException {
          HttpClient client = HttpClient.newHttpClient();
          HttpRequest request = HttpRequest.newBuilder()
                  .uri(URI.create(signedUrl))
                  .header("Content-Type", "image/jpg")
                  .PUT(BodyPublishers.ofFile(Path.of(filePath)))
                  .build();

          HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

          if (response.statusCode() == 200) {
              System.out.println("File upload successful: " + response.statusCode());
          } else {
              System.out.println("File upload failed: " + response.statusCode());
          }
      }
  }

  ```
</CodeGroup>

يرجى التأكد من أن `contentType` المُعيَّن عند إنشاء `uploadUrl` يطابق Content-Type ونوع الملف عند PUT الملف.
على سبيل المثال، إذا عيّنت `contentType` على "image/png" عند إنشاء `uploadUrl`، فتأكد من تعيين `Content-Type: image/png` وأن الملف المُحمَّل ينتهي بـ `.png`.

عند التحميل الناجح، ستُعاد استجابة `200`.

### مثال على تحميل ملف ثنائي في Node.js

هنا مثال على تحميل ملف وسائط ثنائي باستخدام Node مع JavaScript:

```javascript theme={"system"}
const fs = require("fs");
const request = require("request");

const API_KEY = "Your API Key";
const fileName = "test.png";
const endpoint = `https://api.ayrshare.com/api/media/uploadUrl?fileName=${fileName}&contentType=png`;

const run = async () => {
  request.get(
    {
      headers: {
        "Content-Type": "application/json",
        Authorization: `Bearer ${API_KEY}`
      },
      url: endpoint
    },
    (err, res, body) => {
      if (err) {
        return console.error(err);
      }

      const json = JSON.parse(body);
      console.log("Upload URL:", json);

      return fs.createReadStream(`./${fileName}`).pipe(
        request.put(
          json.uploadUrl,
          {
            headers: {
              "Content-Type": json.contentType
            }
          },
          (err, httpsResponse, body) => {
            if (err) {
              console.error("err", err);
            } else {
              console.log(body);
            }
          }
        )
      );
    }
  );
};

run();
```

### مثال على تحميل ملف ثنائي في Postman

يمكنك أيضًا استخدام Postman لتحميل الملف الثنائي إلى `uploadUrl`.

في Postman:

1. اختر طريقة HTTP `PUT`.
2. الصق `uploadUrl` في حقل url. لاحظ أن عنوان URL سينتهي بعد ساعة ولا يمكن استخدامه إلا مرة واحدة. إذا قمت باستدعاء وفشل، يجب عليك إعادة إنشاء `uploadUrl`.
3. في *Headers* عيّن `Content-Type` ليكون نوع المحتوى المُعاد في نقطة نهاية /uploadUrl. على سبيل المثال: `Content-Type: image/png`.
4. اختر *Body -> binary* واختر الملف المراد تحميله.
5. اضغط **Send**.
6. **مهم**: لن تحدث استجابة إرجاع، لذا يجب عليك التحقق مما إذا كان التحميل قد نجح بفتح `accessUrl` المُعاد من نقطة نهاية /uploadUrl في متصفح. يمكنك أيضًا استخدام [نقطة نهاية التحقق من URL](/apis/media/verify-media-url).

<img class="center" src="https://mintcdn.com/ayrshare-docs/Nmrhj2Gh7WSf62Bh/images/apis/validate/postman%20binary.webp?fit=max&auto=format&n=Nmrhj2Gh7WSf62Bh&q=85&s=ca3def769242814afb17a58d9268667f" alt="Postman Binary Upload" width="1536" height="189" data-path="images/apis/validate/postman binary.webp" />

<Card title="ملف JSON نموذجي لـ Postman" icon="file" href="/files/Large Media File Upload.postman_collection.json" horizontal />

<ResponseExample>
  ```javascript 200: عنوان URL للتحميل وعنوان URL للوصول theme={"system"}
  {
      "accessUrl": "https://media.ayrshare.com/Aswmfs3dIEbwLSdhTlV2/test.mp4",
      "contentType": "video/mp4",
      "uploadUrl": "https://storage.googleapis.com/..."
  }
  ```

  ```json 400: خطأ طلب غير صالح في الحصول على URL موقّع theme={"system"}
  {
    "action": "upload",
    "status": "error",
    "code": 301,
    "message": "The provided content-type 'movd' is not recognized."
  }
  ```
</ResponseExample>
