API:Upload

POST request to upload a file.

There are three methods of uploading files via the API:


 * 1) Uploading a local file directly


 * 1) Uploading a copy of a file from a URL


 * 1) Uploading a local file in chunks

All of these methods require an account with the   right.

Upload warnings
Note that an upload may fail due to a number of warning conditions. This can be overridden by setting. Some notable warnings include:


 * exists: A file with the given name already exists. If this warning is ignored, the uploaded file will replace the existing file.
 * no-change: A file with the given name already exists and is exactly the same as the uploaded file.
 * duplicate-version: A file with the given name already exists and and old version of that file is exactly the same as the uploaded file.
 * was-deleted: a file with the given name used to exist but has been deleted.
 * duplicate: The uploaded file exists under a different (or the same) name. Uploading a duplicate may be undesirable.
 * duplicate-archive: The uploaded used to exist under a different (or the same) name but has been deleted. This may indicate that the file is inappropriate and should not be uploaded.

Example
Making any POST request is a multi-step process:

  Log in, via one of the methods described in .   GET a :

  Send a POST request, with the CSRF token to upload a file.  

Example 1: Upload a local file directly
When uploading files directly, the request must use   as Content-Type or enctype,   will not work.

Example 2: Upload file from URL
This requires <tvar|1> </> in the wiki's local settings and an account with the <tvar|2> </> user right.

Example 3: Upload file in chunks
Since uploading a huge file in a single HTTP POST can be unreliable, the API also supports a chunked upload mode, where you make multiple requests with portions of the file. This is available in MediaWiki version 1.20 and above, although prior to version 1.25, SVGs could not be uploaded via chunked uploading. This is used by <tvar|1></> in browsers supporting <tvar|2>FileAPI</>, uploading files in chunks of 1 megabyte, but you may choose your own size. This works in conjunction with the stash mode, to build a file up in pieces and then commit it at the end.

Step 1: Pass content for the first chunk


For all the chunks except the last chunk you will receive this:

Step 2: Pass <tvar|1>filekey</> parameter for second and further chunks
You will obtain the <tvar|1> </> parameter from the previous continue result as well:



For the last chunk, you will receive this:

Step 3: Final upload using the <tvar|1>filekey</> to commit the upload out of the stash area


The result from the final upload will include the complete, accurate <tvar|1> </> object, comparable to what you would get from a non-chunked upload.

Possible errors
See also the section on 1>#Upload warnings</>|#Upload warnings above.

Parameter history

 * v1.21: Introduced <tvar|1>  </>
 * v1.19: Introduced <tvar|1>    </>
 * v1.18: Introduced <tvar|1>  </>
 * v1.17: Introduced <tvar|1>, ,  ,  </>
 * v1.18: Deprecated <tvar|1> </>
 * v1.17: Deprecated <tvar|1> </>

Additional notes

 * To check the status of an in-progress upload to the stash or the progress of a file being published from the stash, send a POST request:


 * Below is an example of a multipart POST to <tvar|1> </>, representing a single chunk. Note that you must unstash the file for it to appear in the Wiki once you have successfully uploaded all your chunks.

User-Agent: <YOUR USER-AGENT> Content-Type: multipart/form-data; boundary=--24b7c3bb-fb4d-45c3-937c-11c2e0c2525b Host: commons.wikimedia.org Cookie: Connection: Keep-Alive

--24b7c3bb-fb4d-45c3-937c-11c2e0c2525b Content-Disposition: form-data; name="filename" Content-Length: 20

UploadTest356456.png --24b7c3bb-fb4d-45c3-937c-11c2e0c2525b Content-Disposition: form-data; name="offset" Content-Length: 1

0 --24b7c3bb-fb4d-45c3-937c-11c2e0c2525b Content-Disposition: form-data; name="format" Content-Length: 4

json --24b7c3bb-fb4d-45c3-937c-11c2e0c2525b Content-Disposition: form-data; name="ignorewarnings" Content-Length: 1

1 --24b7c3bb-fb4d-45c3-937c-11c2e0c2525b Content-Disposition: form-data; name="filesize" Content-Length: 3

971 --24b7c3bb-fb4d-45c3-937c-11c2e0c2525b Content-Disposition: form-data; name="token" Content-Length: 42

<YOUR_CSRF_TOKEN_HERE> --24b7c3bb-fb4d-45c3-937c-11c2e0c2525b Content-Disposition: form-data; name="stash" Content-Length: 1

1 --24b7c3bb-fb4d-45c3-937c-11c2e0c2525b Content-Disposition: form-data; name="chunk"; filename="1.png" Content-Type: application/octet-stream Content-Length: 971

<RAW_BYTES_FROM_FILE_HERE> --24b7c3bb-fb4d-45c3-937c-11c2e0c2525b--