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

# 画像または動画のアップロード

> 投稿に含める画像または小さな動画ファイルをアップロードする

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

このエンドポイントを使うと、投稿に含めるファイル（画像または小さな動画）をアップロードできます。返されるURLは/postエンドポイントで使用できます。

ファイルは、フォームパラメータとして\_**multipart form data**\_で渡すか、ボディパラメータとして**Base64エンコードされたファイル**で渡すことができます。

メディアアップロードに関する重要な注意事項:

1. 最高のパフォーマンスのために、以下をお勧めします
   <ul className="custom-bullets">
     <li>自身のサーバー（例: AWS S3）にメディアファイルをホスティングする。</li>
     <li>[/post](/apis/post/overview)エンドポイントの`mediaUrls`パラメータにメディアURLを直接渡す。</li>
     <li>このエンドポイントを介してファイルをアップロードするより高速です。</li>
   </ul>

2. メディアファイルの保持

   <ul className="custom-bullets">
     <li>アップロードされたファイルは90日間保存されます。</li>
     <li>90日経過後:</li>

     <ul className="custom-bullets">
       <li>ソーシャルネットワーク上で公開された投稿は影響を受けません。</li>
       <li>スケジュール済み投稿が期限切れのメディアを参照している場合、公開に失敗します。</li>
     </ul>
   </ul>

3. ファイルサイズ制限
   <ul className="custom-bullets">
     <li>最大ファイルサイズ: 30 MB。</li>
     <li>より大きいファイルについては、[大きなメディアアップロードの取り扱い](/apis/media/upload-large-media)ガイドを参照してください。</li>
   </ul>

<Tip>S3バケットなど外部URLでメディアにアクセス可能な場合、Ayrshareへのファイルアップロードをスキップできます。外部からアクセス可能なURLを`mediaURLs`ボディパラメータに指定して`/post`エンドポイントへPOSTするだけで、ファイルは自動的にアップロードされます。</Tip>

## ヘッダーパラメータ

<HeaderAPI noProfileKey={true} />

<ParamField body="Content-Type" type="string" required>
  multipart form dataを送信する場合は`multipart/form-data`を使用します - 以下を参照してください。それ以外の場合は、標準の`application/json`を送信してください。
</ParamField>

## ボディパラメータ

<ParamField body="file" type="string or object" required>
  最大30 MBのファイルサイズ。

  Base64エンコードではなく、multipart form-dataオブジェクトとして送信することをお勧めします。
</ParamField>

<ParamField body="fileName" type="string">
  アップロードするファイルの名前。
</ParamField>

<ParamField body="description" type="string">
  ファイルの説明。
</ParamField>

### Multipart Form-Dataとして送信

メディアファイルをmultipart form-dataオブジェクトとして送信します。上記のように`Content-Type`を必ず指定してください。

### Base64として送信

メディアファイルをData URI文字列としてBase64エンコードされた文字列で送信します。文字列は`data:content/type;base64`で始まる必要があります。

Data URI出力形式でのエンコード例:

<ul className="custom-bullets">
  <li>画像: [https://base64.guru/converter/encode/image](https://base64.guru/converter/encode/image)</li>
  <li>動画: [https://base64.guru/converter/encode/video](https://base64.guru/converter/encode/video)</li>
</ul>

注意: /postエンドポイントは、`mediaUrls`パラメータを使用して外部URL経由でより大きなファイルを受け入れます。

<RequestExample>
  ```bash cURL theme={"system"}
  # Send as 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

  # Send as 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"}
  // Send as 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}`
      // Don't set Content-Type header - FormData will set it automatically with boundary
    },
    body: form
  })
  .then(res => res.json())
  .then(json => console.log(json))
  .catch(console.error);

  // Send as 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"}
  # Send as Multipart Form-Data
  import requests

  # For a local file:
  files = {
      'file': ('test.png', open('test.png', 'rb')),
  }

  # Form data
  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())

  # Send as 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"}
  # Send as Multipart Form-Data
  <?php
    // Generate a boundary string
    $boundary = uniqid();

    // Open the file
    $file = file_get_contents('test.png');

    // Build the multipart form data
    $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";

    // Setup the context for the 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
        ]
    ];

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

    // Print the response
    echo $result;

  # Send as 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>
