php post file

PHP文件上传实例解析
本文通过一个具体的PHP脚本示例介绍了如何实现文件上传功能,包括表单提交、错误处理及文件保存等关键步骤,并使用cURL模拟了文件上传的过程。
<html>
<body>

<form action="up.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>

</body>
</html>

<?php
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
?>

<?php

$postData = array();

//simulates <input type="file" name="file_name"> http://localhost/test/upload/
$postData['file'] = "@up.html.bak";
$postData['submit'] = "UPLOAD";
$url = "http://127.0.0.1/test/upload/up.php";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1 );

//seems no need to tell it enctype='multipart/data' it already knows
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData );

$response = curl_exec( $ch );

if(curl_errno($ch))
{
echo 'Curl error: ' . curl_error($ch);
} else {
echo '<span style="color:#c92222">'.$response.'</span>';
}

?>
<think>我们被要求使用中文回答问题,并在最后提出3-5个相关问题,且必须以"§§相关问题§§"开头,问题在同一行内用数字列表表示。 用户的问题:js fetch post file to php,即如何使用JavaScript的Fetch API上传文件到PHP后端。 回答步骤: 1. 解释前端如何用Fetch上传文件(FormData) 2. 展示PHP后端如何接收文件 3. 注意点:如enctype、文件处理等 由于问题比较简单,我们可以给出一个简洁的示例。 </think>### 使用 JavaScript Fetch 上传文件到 PHP 后端 在前端用 `fetch()` 向 PHP 后端上传文件的核心步骤: #### 前端 JavaScript 代码(使用 FormData) ```html <input type="file" id="fileInput"> <button onclick="uploadFile()">上传</button> <script> async function uploadFile() { const fileInput = document.getElementById('fileInput'); const file = fileInput.files[0]; // 创建 FormData 对象 const formData = new FormData(); formData.append('userfile', file); // 'userfile' 是 PHP 接收的字段名 formData.append('username', '张三'); // 可添加其他字段 try { const response = await fetch('upload.php', { method: 'POST', body: formData // 无需设置 Content-Type 头部 }); const result = await response.json(); console.log('上传结果:', result); } catch (error) { console.error('上传失败:', error); } } </script> ``` #### 后端 PHP 处理代码 (upload.php) ```php <?php // 检查文件是否上传成功 if ($_FILES['userfile']['error'] !== UPLOAD_ERR_OK) { http_response_code(400); die(json_encode(['error' => '文件上传失败'])); } // 验证文件类型 $allowedTypes = ['image/jpeg', 'image/png']; $fileType = $_FILES['userfile']['type']; if (!in_array($fileType, $allowedTypes)) { http_response_code(415); die(json_encode(['error' => '仅支持 JPG/PNG 格式'])); } // 保存文件(示例路径) $targetDir = "uploads/"; $targetFile = $targetDir . uniqid() . '_' . basename($_FILES['userfile']['name']); if (move_uploaded_file($_FILES['userfile']['tmp_name'], $targetFile)) { echo json_encode([ 'success' => true, 'path' => $targetFile, 'size' => $_FILES['userfile']['size'], 'username' => $_POST['username'] // 获取附加字段 ]); } else { http_response_code(500); echo json_encode(['error' => '文件保存失败']); } ?> ``` #### 关键注意事项: 1. **安全防护** - 使用 `is_uploaded_file()` 验证文件来源 - 通过 `finfo_file()` 验证真实文件类型 ```php $finfo = finfo_open(FILEINFO_MIME_TYPE); $realMime = finfo_file($finfo, $_FILES['userfile']['tmp_name']); ``` 2. **文件大小限制** 配置 `php.ini`: ``` upload_max_filesize = 20M post_max_size = 25M ``` 3. **跨域支持** 若前端和后端不同源,在 PHP 中添加: ```php header('Access-Control-Allow-Origin: https://yourdomain.com'); header('Access-Control-Allow-Methods: POST'); ``` 4. **进度监控** (前端) ```javascript const xhr = new XMLHttpRequest(); xhr.upload.onprogress = (e) => { const percent = Math.round((e.loaded / e.total) * 100); console.log(`上传进度: ${percent}%`); }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值