我有一個文件輸入前端表格任何人(沒有註冊用戶)可以上傳一個圖像,將附加到一個自定義元字段後端。要預覽圖像,我使用舊的iframe
技術。我的形式如下:從前端預覽和發佈圖片與WordPress的安全問題
<form id="upload-photo" method="post" target="preview-iframe" action="<?= get_template_directory_uri() ?>/inc/upload.php" enctype="multipart/form-data" >
<div id="preview"><img src="" alt="" /></div>
<iframe id="preview-iframe" name="preview-iframe" src=""></iframe>
<input type="file" name="author_photo" />
<input type="hidden" id="attachment" name="attachment" value=""/>
<button type="submit" id="upload">Upload</button>
</form>
然後我使用WordPress內置的函數來處理上傳和文件移動到媒體庫。我使用隱藏字段來存儲附件的WordPress id
,因此如果用戶決定通過上傳新圖片來更改圖片,那麼舊圖片將被刪除。這是我的PHP:
<?php
define('WP_USE_THEMES', false);
require_once '../../../../wp-load.php';
require_once(ABSPATH .'wp-admin/includes/image.php');
require_once(ABSPATH .'wp-admin/includes/file.php');
require_once(ABSPATH .'wp-admin/includes/media.php');
if (isset($_POST['attachment'])) {
wp_delete_attachment($_POST['attachment'], true);
}
foreach ($_FILES as $file => $data) {
if ($data['error'] === UPLOAD_ERR_OK) {
$attachment = media_handle_upload($file, null);
}
}
echo wp_get_attachment_image($attachment, 'author', 0, array('id' => $attachment));
?>
最後jQuery的是膠合一起:
var $preview = $('#preview'),
$iframe = $('#preview-iframe'),
$attachment = $('#attachment');
$('#upload').click(function() {
$iframe.load(function() {
var img = $iframe.contents().find('img')[0];
$preview.find('img').attr('src', img.src);
$attachment.val(img.id);
});
});
一切都運行完美,但也有與這種簡單的方法幾個問題:
如果JavaScript已禁用圖片不會被刪除
如果用戶上傳然後刷新該網站,然後上傳和其他圖像,然後前一個不會被刪除,因爲之前的附件ID由於刷新而不存在。
惡意用戶可以用不同的ID編輯隱藏的
attachment
字段。
我雖然對上傳文件到/temp
文件夾預覽僅供參考,然後運行一個cron作業每X時間空出來。但是,如何在整個表單提交後利用WordPress功能將圖像從/temp
移動到圖庫中,以便我可以獲取附件ID並鏈接到該帖子?
請注意,我有兩種形式,一種用於處理圖像,另一種是全球形式,所有內容將會發布,並且已經可以工作,因爲我可以將新帖子發佈爲「草稿」,管理員擁有權力決定。但如何安全地爲圖像做到這一點?如何預覽圖像並將其放入圖庫僅當表單已成功發佈?
我知道FileReader API,但我需要IE8 +的兼容性,所以不會這樣做。我也知道所有的Flash和Silverlight解決方案,但這也不是一種選擇。也請不要只鏈接到WordPress插件,我試圖在這裏學習。