我有以下javascript验证并传递'艺术品'将文件发送到我服务器上的PHP脚本,然后对其自身进行冗余验证(一个永远不会太安全),然后将文件写入/上传。
我需要将$basename
PHP变量的最终状态转储回javascript,然后将其写入隐藏输入(ID="artwork_filename"
)。
我可以将$ basename回应成功'处理程序,但它感觉非常优雅,然后必须捕获$basename
并将其从结果中删除 - 我想要一个优雅的解决方案,最好将$basename
直接传递给javascript上的变量。
使用Javascript:
<script>
function _(el) {
return document.getElementById(el);
}
function uploadFile() {
var file = _("file").files[0];
if (file == null) {
_("status").innerHTML = "<span style=" + '"color: black;">' + "Please select a file before clicking upload</span>";
}
//alert(file.name+" | "+file.size+" | "+file.type);
if (file.type==="application/zip"
|| file.type==="application/x-zip"
|| file.type==="application/x-zip-compressed") {
if (file.size < 52428800) {
var formdata = new FormData();
formdata.append("file", file);
var ajax = new XMLHttpRequest();
ajax.upload.addEventListener("progress", progressHandler, false);
ajax.addEventListener("load", completeHandler, false);
ajax.addEventListener("abort", abortHandler, false);
ajax.open("POST", "upload_artwork.php");
ajax.send(formdata);
} else {
//alert("File is too big! Max upload size is 50MB. To upload a bigger file, please contact us for instructions");
_("status").innerHTML = "<span style=" + '"color: red;">' + "File is too big! Max upload size is 50MB</span>";
exit();
}
} else {
_("status").innerHTML = "<span style=" + '"color: red;">' + "Upload stopped! Did you 'zip' your file?</span>";
exit();
}
}
function progressHandler(event) {
//_("loaded_n_total").innerHTML = "Uploaded: "+event.loaded+" bytes of "+event.total;
var percent = (event.loaded / event.total) * 100;
_("progress_bar").value = Math.round(percent);
_("status").innerHTML = Math.round(percent)+"% uploaded... please wait";
}
function completeHandler(event) {
_("status").innerHTML = event.target.responseText;
_("progress_bar").value = 0;
}
function errorHandler(event) {
_("status").innerHTML = "<span style=" + '"color: red;">' + "Upload failed! Notify site administrator</span>";
}
function abortHandler(event) {
_("status").innerHTML = "<span style=" + '"color: red;">' + "Upload aborted! Please try again</span>";
}
</script>
&#13;
<input id="artwork_filename" type="hidden" name="custom" value="" />
&#13;
PHP:
<?php
$allowedExts = array("zip", "rar"/*, "ai", "eps", "psd", "bmp", "jpg", "png", "tiff"*/);
if (@$_FILES['file'] == null) {
echo "<span style=" . '"color: red;">' . "Please choose a file before clicking upload</span>";
exit();
} else {
$fileName = $_FILES["file"]["name"];
$fileTmpLoc = $_FILES["file"]["tmp_name"];
$fileType = $_FILES["file"]["type"];
$fileSize = $_FILES["file"]["size"];
$fileErrorMsg = $_FILES["file"]["error"];
$temp = explode(".", $_FILES["file"]["name"]);
$name = pathinfo($_FILES["file"]["name"], PATHINFO_FILENAME);
$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
$i = '';
}
//Check for max file size breach
//OR NOT: stop it on JS side to prevent long file upload
//and then alerting user that their file is too big!
//(Also prevents sidestepping ugly PHP error kickout if file is too big.
if ((($_FILES["file"]["type"] == "application/zip")
|| ($_FILES["file"]["type"] == "application/x-zip")
|| ($_FILES["file"]["type"] == "application/x-zip-compressed")
//|| ($_FILES["file"]["type"] == "application/x-rar-compressed")
/*|| ($_FILES["file"]["type"] == "application/postscript")
|| ($_FILES["file"]["type"] == "image/vnd.adobe.photoshop")
|| ($_FILES["file"]["type"] == "image/bmp")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/tiff")*/)
&& ($_FILES["file"]["size"] < 52428800)
&& in_array($extension, $allowedExts)) {
if ($_FILES["file"]["error"] > 0) {
echo "Upload error! Please notify site administrator";
} else {
if (file_exists("upload/" . $name . $i . '.' . $extension)) {
while(file_exists("upload/" . $name . $i . '.' . $extension)) {
$i++;
}
$basename = $name . $i . '.' . $extension;
if(move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $basename)) {
echo "<span style=" . '"color: green;">' . "Artwork successfully uploaded</span>";
} else {
echo "<span style=" . '"color: red;">' . "Upload error! Please contact the site administrator and report the issue</span>";
}
} else {
if(move_uploaded_file($fileTmpLoc, "upload/$fileName")) {
echo "<span style=" . '"color: green;">' . "Artwork successfully uploaded</span>";
} else {
echo "<span style=" . '"color: red;">' . "Upload error! Please contact the site administrator and report the issue</span>";
}
}
}
} else {
error_reporting(E_ERROR ^ E_PARSE);
echo "<span style=" . '"color: red;">' . "Upload stopped! Did you 'zip' your file?</span>";
}
?>
答案 0 :(得分:0)
对于要分配给它的javascript变量,您应该能够在echo
之后$basefile
=
变量。
这可能有所帮助:
答案 1 :(得分:0)
在我看来,使用ajax,并更好地分离关注点。让PHP处理updload并返回一些已发生的数据。让javasctipt使用返回的数据执行ajax请求并在请求完成时根据需要更新DOM。让CSS处理样式。如果要更改消息容器的样式,是否真的想要更改javascript和PHP?
我的PHP有点生疏,我通常使用jQuery进行ajax,所以下面可能需要一些“按摩”才能做到正确但它应该让你上路。
<强> PHP 强>
<?php
$allowedExts = array("zip", "rar");
if (@$_FILES['file'] == null) {
$dataOut["success"] = false;
$dataOut["message"] = 'Please choose a file before clicking upload';
$dataOut["baseName"] = '';
exit();
} else {
$fileName = $_FILES["file"]["name"];
$fileTmpLoc = $_FILES["file"]["tmp_name"];
$fileType = $_FILES["file"]["type"];
$fileSize = $_FILES["file"]["size"];
$fileErrorMsg = $_FILES["file"]["error"];
$temp = explode(".", $_FILES["file"]["name"]);
$name = pathinfo($_FILES["file"]["name"], PATHINFO_FILENAME);
$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
$i = '';
$dataOut["success"] = false;
$dataOut["message"] = '';
$dataOut["baseName"] = '';
}
//Check for fucking max file size breach
//OR NOT: stop it on JS side to prevent long file upload
//and then alerting user that their file is too big!
//(Also prevents sidestepping ugly PHP error kickout if file is too big.
if ((($_FILES["file"]["type"] == "application/zip")
|| ($_FILES["file"]["type"] == "application/x-zip")
|| ($_FILES["file"]["type"] == "application/x-zip-compressed")
)
&& ($_FILES["file"]["size"] < 52428800)
&& in_array($extension, $allowedExts)) {
if ($_FILES["file"]["error"] > 0) {
echo "Upload error! Please notify site administrator";
} else {
if (file_exists("upload/" . $name . $i . '.' . $extension)) {
while(file_exists("upload/" . $name . $i . '.' . $extension)) {
$i++;
}
$basename = $name . $i . '.' . $extension;
$dataOut["baseName"] = $basename;
if(move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $basename)) {
$dataOut["success"] = true;
$dataOut["message"] = "Artwork successfully uploaded";
} else {
$dataOut["success"] = false;
$dataOut["message"] = "Upload error! Please contact the site administrator and report the issue";
}
} else {
if(move_uploaded_file($fileTmpLoc, "upload/$fileName")) {
$dataOut["success"] = true;
$dataOut["message"] = "Artwork successfully uploaded";
} else {
$dataOut["success"] = false;
$dataOut["message"] = "Upload error! Please contact the site administrator and report the issue";
}
}
}
} else {
error_reporting(E_ERROR ^ E_PARSE);
$dataOut["success"] = false;
$dataOut["message"] = "Upload stopped! Did you 'zip' your file?";
}
echo json_encode($dataOut);
?>
<script>
function _(el) {
return document.getElementById(el);
}
function setStats(status, message){
if(status === null){
_("status").className = "info";
}else if(status){
_("status").className = "success";
}else{
_("status").className = "error";
}
_("status").innerHTML = message;
}
function uploadFile() {
var file = _("file").files[0];
if (file == null) {
setStatus(null, "Please select a file before clicking upload");
}
//alert(file.name+" | "+file.size+" | "+file.type);
if (file.type==="application/zip"
|| file.type==="application/x-zip"
|| file.type==="application/x-zip-compressed") {
if (file.size < 52428800) {
var formdata = new FormData();
formdata.append("file", file);
var ajax = new XMLHttpRequest();
ajax.responseType = "json";
ajax.upload.addEventListener("progress", progressHandler, false);
ajax.addEventListener("load", completeHandler, false);
ajax.addEventListener("abort", abortHandler, false);
ajax.open("POST", "upload_artwork.php");
ajax.send(formdata);
} else {
//alert("File is too big! Max upload size is 50MB. To upload a bigger file, please contact us for instructions");
setStatus(false,"File is too big! Max upload size is 50MB");
exit();
}
} else {
setStatus(false, "Upload stopped! Did you 'zip' your file?");
exit();
}
}
function progressHandler(event) {
//_("loaded_n_total").innerHTML = "Uploaded: "+event.loaded+" bytes of "+event.total;
var percent = (event.loaded / event.total) * 100;
_("progress_bar").value = Math.round(percent);
_("status").innerHTML = Math.round(percent)+"% uploaded... please wait";
}
function completeHandler(event) {
var jData = JSON.parse(event.target.responseText);
document.getElementByID("artwork_filename").value = jData["baseName"];
setStatus(jData["success"], jData["message"] );
_("progress_bar").value = 0;
}
function errorHandler(event) {
setStatus(false,"Upload failed! Notify site administrator");
}
function abortHandler(event) {
setStatus(flase,"Upload aborted! Please try again");
}
</script>
.info {color:#000;}
.error {color:#F00;}
.success {color:#0F0;}
<input id="artwork_filename" type="hidden" name="custom" value="" />
您可以进行其他改进,但这应该是一个很好的起点。