某些虛擬主機或代理伺服器在上傳檔案時會自動加入 Content-Type 標頭,導致二進位檔案(如圖片、壓縮檔)損壞。本方案透過將二進位檔案讀取為文字字串(Base64 或原始位元組),在瀏覽器端複製貼上,再於遠端伺服器端還原,繞過上傳限制。
test(需預先更名)並輸出至文字區域;保存模式將文字區域內容寫入檔案;試看模式直接輸出圖片標籤預覽。$view 參數決定行為:0 保存、1 試看、2 讀取。<html>
<head>
<title>以文字方式上傳二進位檔案的 PHP 程式</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF">
<table width="760" border="0" cellspacing="0" cellpadding="0" height="25">
<tr>
<td><div align="center"><b>圖片上傳</b></div></td>
</tr>
</table>
<table width="760" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<form name="form" method="post" action="action.php" target="_blank">
<div align="center">
<textarea name="pic" cols="80" rows="15"></textarea><br>
<input type="radio" name="view" value="0" checked> 保存
<input type="radio" name="view" value="1"> 試看
<input type="radio" name="view" value="2"> 讀取<br>
<input type="submit" name="OK" value=" 確 定 ">
<input type="reset" name="RESET" value=" 取 消 ">
</div>
</form>
</td>
</tr>
</table>
</body>
</html>
原始碼僅提供開頭,建議補完如下邏輯:
<?php
$file = "test"; // 固定檔名
switch ($_POST['view']) {
case '2': // 讀取
if (file_exists($file)) {
$fp = fopen($file, "rb");
$data = fread($fp, filesize($file));
fclose($fp);
// 直接輸出二進位資料,或 base64_encode 後輸出
echo $data; // 瀏覽器會顯示亂碼,使用者複製此內容
}
break;
case '1': // 試看
if (file_exists($file)) {
header("Content-Type: image/gif"); // 或自動偵測
readfile($file);
}
break;
case '0': // 保存
$data = $_POST['pic'];
// 若前端為 base64,需 base64_decode
$fp = fopen($file, "wb");
fwrite($fp, $data);
fclose($fp);
echo "儲存完成";
break;
}
?>
POST 上傳或 FTP/SFTP/SCP,本方案僅為特殊受限環境備案。