> ## 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.

# Tải lên Hình ảnh hoặc Video

> Tải lên một hình ảnh hoặc tệp video nhỏ để đưa vào bài đăng của bạn

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} />

Endpoint này cho phép bạn tải lên một tệp hoặc một hình ảnh hoặc video nhỏ để đưa vào bài đăng của bạn. URL đến hình ảnh sẽ được trả về, có thể được sử dụng trong endpoint /post.

Bạn có thể truyền tệp dưới dạng ***multipart form data*** như một tham số form hoặc dưới dạng **tệp mã hóa Base64** như một tham số body.

Lưu ý quan trọng về việc tải lên media:

1. Để có hiệu suất tốt nhất, chúng tôi khuyến nghị
   <ul className="custom-bullets">
     <li>Lưu trữ các tệp media trên máy chủ của riêng bạn (ví dụ AWS S3).</li>
     <li>Truyền trực tiếp URL media trong tham số `mediaUrls` của endpoint [/post](/apis/post/overview).</li>
     <li>Cách tiếp cận này nhanh hơn so với việc tải lên tệp thông qua endpoint này.</li>
   </ul>

2. Lưu giữ tệp media

   <ul className="custom-bullets">
     <li>Các tệp đã tải lên được lưu trữ trong 90 ngày.</li>
     <li>Sau 90 ngày:</li>

     <ul className="custom-bullets">
       <li>Các bài đăng đã xuất bản trên mạng xã hội không bị ảnh hưởng.</li>
       <li>Các bài đăng đã lên lịch sẽ không xuất bản được nếu chúng tham chiếu đến media đã hết hạn.</li>
     </ul>
   </ul>

3. Giới hạn kích thước tệp
   <ul className="custom-bullets">
     <li>Kích thước tệp tối đa: 30 MB.</li>
     <li>Đối với các tệp lớn hơn, xem hướng dẫn của chúng tôi về [xử lý tải lên media lớn](/apis/media/upload-large-media).</li>
   </ul>

<Tip>Nếu bạn đã có media có thể truy cập bằng URL bên ngoài, chẳng hạn như một S3 bucket, bạn có thể bỏ qua việc tải các tệp lên Ayrshare. Chỉ cần POST đến endpoint `/post` với URL có thể truy cập từ bên ngoài của bạn trong tham số body `mediaURLs` và tệp của bạn sẽ tự động được tải lên.</Tip>

## Tham số Header

<HeaderAPI noProfileKey={true} />

<ParamField body="Content-Type" type="string" required>
  Sử dụng `multipart/form-data` nếu gửi dữ liệu multipart form - xem bên dưới. Nếu không, gửi `application/json` chuẩn.
</ParamField>

## Tham số Body

<ParamField body="file" type="string or object" required>
  Kích thước tệp tối đa 30 MB.

  Chúng tôi khuyến nghị gửi dưới dạng đối tượng multipart form-data thay vì mã hóa Base64.
</ParamField>

<ParamField body="fileName" type="string">
  Tên của tệp sẽ được tải lên.
</ParamField>

<ParamField body="description" type="string">
  Mô tả của tệp.
</ParamField>

### Gửi dưới dạng Multipart Form-Data

Gửi tệp media dưới dạng đối tượng multipart form-data. Hãy đảm bảo chỉ định `Content-Type` như đã đề cập ở trên.

### Gửi dưới dạng Base64

Gửi tệp media dưới dạng chuỗi được mã hóa Base64 dưới dạng chuỗi Data URI. Chuỗi phải bắt đầu bằng `data:content/type;base64`

Ví dụ mã hóa với Định dạng Đầu ra Data URI:

<ul className="custom-bullets">
  <li>Hình ảnh: [https://base64.guru/converter/encode/image](https://base64.guru/converter/encode/image)</li>
  <li>Video: [https://base64.guru/converter/encode/video](https://base64.guru/converter/encode/video)</li>
</ul>

Lưu ý: Endpoint /post chấp nhận các tệp lớn hơn thông qua URL bên ngoài với tham số `mediaUrls`.

<RequestExample>
  ```bash cURL theme={"system"}
  # Gửi dưới dạng Multipart Form-Data
  curl \
  -H "Authorization: Bearer API_KEY" \
  -F "file=@test.png" \
  -F "fileName=test.png" \
  -F "description=best image" \
  -X POST https://api.ayrshare.com/api/media/upload

  # Gửi dưới dạng Base64
  curl \
  -H "Authorization: Bearer API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"file": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQ...", "fileName": "test.png", "description": "best image"}' \
  -X POST https://api.ayrshare.com/api/media/upload
  ```

  ```javascript JavaScript theme={"system"}
  // Gửi dưới dạng Multipart Form-Data
  const FormData = require('form-data');
  const fs = require('fs');

  const API_KEY = "API_KEY";
  const imagePath = './test.png';

  const form = new FormData();
  form.append('file', fs.createReadStream(imagePath));
  form.append('fileName', 'test.png');
  form.append('description', 'best image');

  fetch("https://api.ayrshare.com/api/media/upload", {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${API_KEY}`
      // Không đặt header Content-Type - FormData sẽ tự động đặt nó với boundary
    },
    body: form
  })
  .then(res => res.json())
  .then(json => console.log(json))
  .catch(console.error);

  // Gửi dưới dạng Base64
  const API_KEY = "API_KEY";
  const base64 = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQ...";

  fetch("https://api.ayrshare.com/api/media/upload", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          "Authorization": `Bearer ${API_KEY}`
        },
        body: JSON.stringify({
          file: base64,
          fileName: "test.png",
          description: "best image"
        }),
      })
        .then((res) => res.json())
        .then((json) => console.log(json))
        .catch(console.error);
  ```

  ```python Python theme={"system"}
  # Gửi dưới dạng Multipart Form-Data
  import requests

  # Đối với tệp cục bộ:
  files = {
      'file': ('test.png', open('test.png', 'rb')),
  }

  # Dữ liệu form
  data = {
      'fileName': 'test.png',
      'description': 'best image'
  }
  headers = {
      'Authorization': 'Bearer API_KEY'
  }

  r = requests.post(
      'https://api.ayrshare.com/api/media/upload',
      files=files,
      data=data,
      headers=headers
  )

  print(r.json())

  # Gửi dưới dạng Base64
  import requests

  payload = {'file': 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQ...',
          'fileName': "test.png",
          'description': "best image"}
  headers = {'Content-Type': 'application/json',
          'Authorization': 'Bearer API_KEY'}

  r = requests.post('https://api.ayrshare.com/api/media/upload',
      json=payload,
      headers=headers)

  print(r.json())
  ```

  ```php PHP theme={"system"}
  # Gửi dưới dạng Multipart Form-Data
  <?php
    // Tạo chuỗi boundary
    $boundary = uniqid();

    // Mở tệp
    $file = file_get_contents('test.png');

    // Xây dựng dữ liệu multipart form
    $data = '';
    $data .= "--" . $boundary . "\r\n";
    $data .= 'Content-Disposition: form-data; name="file"; filename="test.png"' . "\r\n";
    $data .= "Content-Type: image/png\r\n\r\n";
    $data .= $file . "\r\n";

    $data .= "--" . $boundary . "\r\n";
    $data .= 'Content-Disposition: form-data; name="fileName"' . "\r\n\r\n";
    $data .= "test.png\r\n";

    $data .= "--" . $boundary . "\r\n";
    $data .= 'Content-Disposition: form-data; name="description"' . "\r\n\r\n";
    $data .= "best image\r\n";

    $data .= "--" . $boundary . "--\r\n";

    // Thiết lập context cho request
    $options = [
        'http' => [
            'method' => 'POST',
            'header' => "Authorization: Bearer API_KEY\r\n" .
                      "Content-Type: multipart/form-data; boundary=" . $boundary . "\r\n" .
                      "Content-Length: " . strlen($data) . "\r\n",
            'content' => $data
        ]
    ];

    // Gửi request
    $context = stream_context_create($options);
    $result = file_get_contents('https://api.ayrshare.com/api/media/upload', false, $context);

    // In phản hồi
    echo $result;

  # Gửi dưới dạng Base64
  <?php
  $data = [
      'file' => 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQ...',
      'fileName' => "test.png",
      'description' => "best image"
  ];

  $ch = curl_init('https://api.ayrshare.com/api/media/upload');
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, [
      'Content-Type: application/json',
      'Authorization: Bearer API_KEY'
  ]);

  $response = curl_exec($ch);
  curl_close($ch);

  echo json_encode(json_decode($response), JSON_PRETTY_PRINT);
  ```
</RequestExample>

<ResponseExample>
  ```javascript 200: Success theme={"system"}
  {
      "id": "1167335b-6c37-4fc6-ab8a-044e0005d335-jpeg",
      "url": "https://images.ayrshare.com/q3Ls85VTsrbODnGIJHpy7PaHWwA3/1167335b-6c37-4fc6-ab8a-044ed885d.jpeg",
      "fileName": "fun.jpg",
      "description": "good times"
  }
  ```

  ```json 400: Bad Request Error in upload theme={"system"}
  {
    "action": "request",
    "status": "error",
    "code": 101,
    "message": "Missing or incorrect parameters. Please verify with the docs. .../ayrshare.com/rest-api/endpoints"
  }
  ```
</ResponseExample>
