# 使用POST表單上傳文件
Files that are uploaded using forms in POST requests can be retrieved with the Request method`getUploadedFiles()`.
> 在POST請求中使用表單上傳的文件可以使用請求方法“getuploadedfiles()”檢索。
>
When uploading files using a POST request, make sure your file upload form has the attribute`enctype="multipart/form-data"`otherwise`getUploadedFiles()`will return an empty array.
> 當使用POST請求上傳文件時,請確保您的文件上傳表單具有屬性`enctype="multipart/form-data" ' otherwise ' getuploadedfiles()`將返回一個空數組。
If multiple files are uploaded for the same input name, add brackets after the input name in the HTML, otherwise only one uploaded file will be returned for the input name by`getUploadedFiles()`.
> 如果為相同的輸入名上傳了多個文件,則在HTML中的輸入名之后添加括號,否則`getuploadedfiles()`將只返回一個上傳的文件作為輸入名。
Below is an example HTML form that contains both single and multiple file uploads.
> 下面是一個包含單個和多個文件上傳的HTML表單示例。
~~~php
<!-- make sure the attribute enctype is set to multipart/form-data -->
<form method="post" enctype="multipart/form-data">
<!-- upload of a single file -->
<p>
<label>Add file (single): </label><br/>
<input type="file" name="example1"/>
</p>
<!-- multiple input fields for the same input name, use brackets -->
<p>
<label>Add files (up to 2): </label><br/>
<input type="file" name="example2[]"/><br/>
<input type="file" name="example2[]"/>
</p>
<!-- one file input field that allows multiple files to be uploaded, use brackets -->
<p>
<label>Add files (multiple): </label><br/>
<input type="file" name="example3[]" multiple="multiple"/>
</p>
<p>
<input type="submit"/>
</p>
</form>
~~~
Figure 1: Example HTML form for file uploads
> 圖1:文件上傳的HTML表單示例
> 上傳的文件可以移動到一個目錄使用`moveTo`'的方法。下面是處理上述HTML表單上傳文件的示例應用程序。
>
Uploaded files can be moved to a directory using the`moveTo`method. Below is an example application that handles the uploaded files of the HTML form above.
~~~php
<?php
use DI\Container;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use Slim\Factory\AppFactory;
require __DIR__ . '/../vendor/autoload.php';
$container = new Container();
$container->set('upload_directory', __DIR__ . '/uploads');
AppFactory::setContainer($container);
$app = AppFactory::create();
$app->post('/', function(Request $request, Response $response) {
$directory = $this->get('upload_directory');
$uploadedFiles = $request->getUploadedFiles();
// handle single input with single file upload
$uploadedFile = $uploadedFiles['example1'];
if ($uploadedFile->getError() === UPLOAD_ERR_OK) {
$filename = moveUploadedFile($directory, $uploadedFile);
$response->write('uploaded ' . $filename . '<br/>');
}
// handle multiple inputs with the same key
foreach ($uploadedFiles['example2'] as $uploadedFile) {
if ($uploadedFile->getError() === UPLOAD_ERR_OK) {
$filename = moveUploadedFile($directory, $uploadedFile);
$response->write('uploaded ' . $filename . '<br/>');
}
}
// handle single input with multiple file uploads
foreach ($uploadedFiles['example3'] as $uploadedFile) {
if ($uploadedFile->getError() === UPLOAD_ERR_OK) {
$filename = moveUploadedFile($directory, $uploadedFile);
$response->write('uploaded ' . $filename . '<br/>');
}
}
return $response;
});
/**
* Moves the uploaded file to the upload directory and assigns it a unique name
* to avoid overwriting an existing uploaded file.
*
* @param string $directory directory to which the file is moved
* @param UploadedFileInterface $uploaded file uploaded file to move
* @return string filename of moved file
*/
function moveUploadedFile($directory, UploadedFileInterface $uploadedFile)
{
$extension = pathinfo($uploadedFile->getClientFilename(), PATHINFO_EXTENSION);
$basename = bin2hex(random_bytes(8)); // see http://php.net/manual/en/function.random-bytes.php
$filename = sprintf('%s.%0.8s', $basename, $extension);
$uploadedFile->moveTo($directory . DIRECTORY_SEPARATOR . $filename);
return $filename;
}
$app->run();
~~~
> 圖2:處理上傳文件的瘦應用程序示例
>
Figure 2: Example Slim application to handle the uploaded files
- 開始
- 安裝
- 升級指南
- Web服務器
- 概念
- 生命周期
- PSR 7
- 中間件
- 依賴容器
- 實例 及通知和警告處理
- Request
- 請求方法
- 請求頭信息
- 請求主體
- 上傳的文件
- 請求幫助
- 路由對象
- Response
- 響應狀態
- 響應標頭
- 響應體
- 返回JSON
- 視圖模板
- 路由
- 創建路由
- 路由回調
- 路由策略
- 路線占位符
- 路由名
- 路由組
- 路由中間件
- 路由表達式緩存
- 容器識別解析
- 封裝中間件
- 路由的中間件
- 錯誤處理中間件
- 方法重寫的中間件
- 輸出緩沖中間件
- 內容長度中間件
- 擴展功能
- 以 / 結尾的路由模式
- 獲取當前路由
- 設置CORS
- 使用POST表單上傳文件
- 第三方組件
- slim-session
- auth
- slim-api-skeleton
- dir