php $_files 不断上传
我有一个脚本执行一些简单的编辑,效果很好,问题是即使图像上传成功并且我刷新页面,即使没有从表单提交时的文件输入中选择它,也会创建相同的图像:
<form method="post" enctype="multipart/form-data" id="<?php echo $_SERVER['PHP_SELF']; ?>">
<fieldset id="product-images">
<input type="file" id="image" name="image" />
<input type="submit" name="picture" value="upload Picture"/>
</form>
这是 php
<?php if(isset($_POST['picture']) && !empty($_FILES)){(uploadImage($_FILES['image'])} ;?>
function uploadImage($image)
{
$id = intval($_GET['id']);
$size = 75; // the thumbnail height
$filedir = '../img/products/'; // the directory for the original image
$thumbdir = '../img/products/thumbs/'; // the directory for the thumbnail image
$prefix = 'small_'; // the prefix to be added to the original name
$maxfile = '2000000';
$mode = '0666';
$userfile_name = $image['name'];
$userfile_tmp = $image['tmp_name'];
$userfile_size = $image['size'];
$userfile_type = $image['type'];
if (isset($image['name']))
{
$prod_img = $filedir.$userfile_name;
$url = strstr($userfile_name, '.', true);
$type = strstr($userfile_name, '.');
$prod_img_thumb = $thumbdir.$prefix.$userfile_name;
move_uploaded_file($userfile_tmp, $prod_img);
chmod ($prod_img, octdec($mode));
$sizes = getimagesize($prod_img);
$width = $size[0];
$height = $size[1];
if($width > $height) $biggestSide = $width;
else $biggestSide = $height;
//The crop size will be half that of the largest side
$cropPercent = 1;
$cropWidth = $biggestSide*$cropPercent;
$cropHeight = $biggestSide*$cropPercent;
//getting the top left coordinate
$c1 = array("x"=>($width-$cropWidth)/2, "y"=>($height-$cropHeight)/2);
$aspect_ratio = $sizes[1]/$sizes[0];
if ($sizes[1] <= $size)
{
$new_width = $sizes[0];
$new_height = $sizes[1];
}else{
$new_height = $size;
$new_width = abs($new_height/$aspect_ratio);
}
$destimg=ImageCreateTrueColor($new_width,$new_height)
or die('Problem In Creating image');
$srcimg=ImageCreateFromJPEG($prod_img)
or die('Problem In opening Source Image');
if(function_exists('imagecopyresampled'))
{
imagecopyresampled($destimg,$srcimg,0,0,$c1['x'],$c1['y'],$new_width,$new_height,ImageSX($srcimg),ImageSY($srcimg))
or die('Problem In resizing');
}else{
Imagecopyresized($destimg,$srcimg,0,0,0,0,$new_width,$new_height,ImageSX($srcimg),ImageSY($srcimg))
or die('Problem In resizing');
}
ImageJPEG($destimg,$prod_img_thumb,90)
or die('Problem In saving');
imagedestroy($destimg);
imagedestroy($srcimg);
insertURL($id, $url, $type);
}
}
I have a script that performs some simple editing which works fine, the problem is even once the image is uploaded successfully and I refresh the page the same image is being created even though it's not selected from the file input on form submission:
<form method="post" enctype="multipart/form-data" id="<?php echo $_SERVER['PHP_SELF']; ?>">
<fieldset id="product-images">
<input type="file" id="image" name="image" />
<input type="submit" name="picture" value="upload Picture"/>
</form>
Here's the php
<?php if(isset($_POST['picture']) && !empty($_FILES)){(uploadImage($_FILES['image'])} ;?>
function uploadImage($image)
{
$id = intval($_GET['id']);
$size = 75; // the thumbnail height
$filedir = '../img/products/'; // the directory for the original image
$thumbdir = '../img/products/thumbs/'; // the directory for the thumbnail image
$prefix = 'small_'; // the prefix to be added to the original name
$maxfile = '2000000';
$mode = '0666';
$userfile_name = $image['name'];
$userfile_tmp = $image['tmp_name'];
$userfile_size = $image['size'];
$userfile_type = $image['type'];
if (isset($image['name']))
{
$prod_img = $filedir.$userfile_name;
$url = strstr($userfile_name, '.', true);
$type = strstr($userfile_name, '.');
$prod_img_thumb = $thumbdir.$prefix.$userfile_name;
move_uploaded_file($userfile_tmp, $prod_img);
chmod ($prod_img, octdec($mode));
$sizes = getimagesize($prod_img);
$width = $size[0];
$height = $size[1];
if($width > $height) $biggestSide = $width;
else $biggestSide = $height;
//The crop size will be half that of the largest side
$cropPercent = 1;
$cropWidth = $biggestSide*$cropPercent;
$cropHeight = $biggestSide*$cropPercent;
//getting the top left coordinate
$c1 = array("x"=>($width-$cropWidth)/2, "y"=>($height-$cropHeight)/2);
$aspect_ratio = $sizes[1]/$sizes[0];
if ($sizes[1] <= $size)
{
$new_width = $sizes[0];
$new_height = $sizes[1];
}else{
$new_height = $size;
$new_width = abs($new_height/$aspect_ratio);
}
$destimg=ImageCreateTrueColor($new_width,$new_height)
or die('Problem In Creating image');
$srcimg=ImageCreateFromJPEG($prod_img)
or die('Problem In opening Source Image');
if(function_exists('imagecopyresampled'))
{
imagecopyresampled($destimg,$srcimg,0,0,$c1['x'],$c1['y'],$new_width,$new_height,ImageSX($srcimg),ImageSY($srcimg))
or die('Problem In resizing');
}else{
Imagecopyresized($destimg,$srcimg,0,0,0,0,$new_width,$new_height,ImageSX($srcimg),ImageSY($srcimg))
or die('Problem In resizing');
}
ImageJPEG($destimg,$prod_img_thumb,90)
or die('Problem In saving');
imagedestroy($destimg);
imagedestroy($srcimg);
insertURL($id, $url, $type);
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您正在刷新哪个页面? “您上传完成”的那个?按理说——这是上传的结果页面。刷新该页面后,您会看到常见的“此页面是 POST 的结果?重做 POST 吗?”键入警告,这将重新提交整个表单,包括文件。
为了防止刷新重新上传,您必须在表单处理代码完成后将用户重定向到其他地方。
Which page are you refreshing? the "your uploaded completed" one? That stands to reason - it's the result page of the upload. Refreshing that one would give you the usual "this page is the result of a POST? redo the POST?" type warning, which would re-submit the entire form, including the file.
To prevent a refresh from re-doing the upload, you have to redirect the user elsewhere after the form handling code's finished.
在此处阅读有关 POST-REDIRECT-GET 的信息:
http://en.wikipedia.org/wiki/发布/重定向/获取
Read about POST-REDIRECT-GET here:
http://en.wikipedia.org/wiki/Post/Redirect/Get
当您刷新页面时,表单将重新发送,一切都会再次发生。使用表单时的一般规则是在脚本处理完提交的表单后将用户重定向到另一个页面。然后,即使他们重新加载页面,也不会重新提交任何内容,这样的问题就可以避免
When you refresh the page the form is resend, and everything happens again. A general rule when working with forms is to redirect the user to another page after your script has processed the submitted form. Then, even if they reload the page, they will not resubmit anything and problems like this will be avoided