functions/http_form_data/index.php (40 lines of code) (raw):
<?php
/**
* Copyright 2020 Google LLC.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// [START functions_http_form_data]
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use GuzzleHttp\Psr7\Response;
function uploadFile(ServerRequestInterface $request): ResponseInterface
{
if ($request->getMethod() != 'POST') {
return new Response(405, [], 'Method Not Allowed: expected POST, found ' . $request->getMethod());
}
$contentType = $request->getHeader('Content-Type')[0];
if (strpos($contentType, 'multipart/form-data') !== 0) {
return new Response(400, [], 'Bad Request: content of type "multipart/form-data" not provided, found ' . $contentType);
}
$fileList = [];
/** @var $file Psr\Http\Message\UploadedFileInterface */
foreach ($request->getUploadedFiles() as $name => $file) {
// Use caution when trusting the client-provided filename:
// https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload
$fileList[] = $file->getClientFilename();
infoLog('Processing ' . $file->getClientFilename());
$filename = tempnam(sys_get_temp_dir(), $name . '.') . '-' . $file->getClientFilename();
// Use $file->getStream() to process the file contents in ways other than a direct "file save".
infoLog('Saving to ' . $filename);
$file->moveTo($filename);
}
if (empty($fileList)) {
$msg = 'Bad Request: no files sent for upload';
errorLog($msg);
return new Response(400, [], $msg);
}
return new Response(201, [], 'Saved ' . join(', ', $fileList));
}
function errorLog($msg): void
{
$stream = fopen('php://stderr', 'wb');
$entry = json_encode(['msg' => $msg, 'severity' => 'error'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
fwrite($stream, $entry . PHP_EOL);
}
function infoLog($msg): void
{
$stream = fopen('php://stderr', 'wb');
$entry = json_encode(['message' => $msg, 'severity' => 'info'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
fwrite($stream, $entry . PHP_EOL);
}
// [END functions_http_form_data]