2013-03-20 235 views
6

目前我在写一个移动应用程序使用的PhoneGap的帮助的过程。我希望这个应用程序的少数功能之一是能够捕捉图像并将其上传到远程服务器...上传图片

我目前有图像捕获和上传/电子邮件部分工作正常编译apk ...但在我的PHP,我目前命名的图像“图像[从10到20插入随机数] ...这里的问题是,数字可以重复,图像可以被覆盖...我有阅读并思考使用rand()并从0到getrandmax()中选择一个随机数字,但我觉得我可能有相同的文件覆盖机会...我需要将图像上传到服务器每一次独特的名字,不管这么PHP脚本会检查,看看有什么服务器已经有写/一个独特的名字上传的图片么......

“rand()”以外的任何想法?

我还想着也许命名每个图像... IMG +日期+时间+随机5个字符,其中包括字母和数字...因此,如果图像是在上午04时37使用的应用程序采取2013年3月20日,该图像将被上传到服务器时被命名为“img_03-20-13_4-37am_e4r29.jpg”......我认为这可能会奏效......(除非是更好的方法),但我相当公平新的PHP和想不明白怎么写类似的东西...

我的PHP是如下...

print_r($_FILES); 
$new_image_name = "image".rand(10, 20).".jpg"; 
move_uploaded_file($_FILES["file"]["tmp_name"], "/home/virtual/domain.com/public_html/upload/".$new_image_name); 

任何帮助表示赞赏... 谢谢提前! 此外,请让我知道,如果有任何进一步的信息,我可能会离开...

+0

'$ new_image_name =“image”.microtime()。“。jpg”;'应该满足您的需求如果2张图片没有完全同时处理(小数秒)。 – Waygood 2013-03-20 09:28:38

回答

16

你可能要考虑的PHP的uniqid()功能。 这样你建议的代码看起来像下面这样:

$new_image_name = 'image_' . date('Y-m-d-H-i-s') . '_' . uniqid() . '.jpg'; 
// do some checks to make sure the file you have is an image and if you can trust it 
move_uploaded_file($_FILES["file"]["tmp_name"], "/home/virtual/domain.com/public_html/upload/".$new_image_name); 

也请记住,你的服务器的随机函数并不是真正随机的。如果您需要确实是随机的东西,请尝试random.org。随机随机。

UPD:为了在您的代码中使用random.org,您必须对其服务器执行一些API请求。有关的文档可以在这里找到:www.random.org/clients/http/

通话的例子是:random.org/integers/?num=1&min=1&max=1000000000&col=1&base=10&format=plain&rnd=new。请注意,您可以更改minmax和其它参数,如documentation描述。

在PHP中,您可以使用file_get_contents()函数,cURL函数库或甚至套接字向远程服务器发出GET请求。如果您使用的是共享主机,则传出的连接应该可用并可用于您的帐户。

$random_int = file_get_contents('http://www.random.org/integers/?num=1&min=1&max=1000000000&col=1&base=10&format=plain&rnd=new'); 
var_dump($random_int); 
+0

+1很好地完成。 “基于当前时间以微秒为单位” – Waygood 2013-03-20 09:30:47

+0

这似乎工作得很好,但我如何整合random.org?我绝对对真正的随机性感兴趣 – JStormThaKid 2013-03-20 09:58:52

1

你有没有考虑使用md5_file? 这样你的所有文件都将具有唯一的名称,你不必担心重名。但请注意,如果内容相同,这将返回相同的字符串。

而且,这里是另一种方法:

do { 
    $filename = DIR_UPLOAD_PATH . '/' . make_string(10) . '-' . make_string(10) . '-' . make_string(10) . '-' . make_string(10); 
} while(is_file($filename)); 

return $filename; 

/** 
* Make random string 
* 
* @param integer $length 
* @param string $allowed_chars 
* @return string 
*/ 
function make_string($length = 10, $allowed_chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890') { 
    $allowed_chars_len = strlen($allowed_chars); 

    if($allowed_chars_len == 1) { 
    return str_pad('', $length, $allowed_chars); 
    } else { 
    $result = ''; 

    while(strlen($result) < $length) { 
     $result .= substr($allowed_chars, rand(0, $allowed_chars_len), 1); 
    } // while 

    return $result; 
    } // if 
} // make_string 
+0

如果它们被称为相同,该怎么办? md5_file('image.jpg')=== md5_file('image.jpg') – Waygood 2013-03-20 09:25:26

+0

或者我可以一起摆脱“图像”?做一些像print_r($ _ FILES); $ new_image_name = md5()。“。jpg”; move_uploaded_file($ _ FILES [“file”] [“tmp_name”],“/home/virtual/domain.com/public_html/upload/".$new_image_name); – JStormThaKid 2013-03-20 09:28:05

+0

会工作吗? – JStormThaKid 2013-03-20 09:29:39

-1

函数将在上传图像之前创建一个唯一的名称。

// Upload file with unique name 
if (! function_exists('getUniqueFilename')) 
{ 
    function getUniqueFilename($file) 
    { 
     if(is_array($file) and $file['name'] != '') 
     { 
      // getting file extension 
      $fnarr   = explode(".", $file['name']); 
      $file_extension = strtolower($fnarr[count($fnarr)-1]); 

      // getting unique file name 
      $file_name = substr(md5($file['name'].time()), 5, 15).".".$file_extension; 
      return $file_name; 

     } // ends for is_array check 
     else 
     { 
      return ''; 

     } // else ends 

    } // ends 
} 
+0

与其他答案一样,随机!=独特。 – 2014-06-17 05:00:37

+0

另外,在同一秒内上传两次肯定会导致问题。 – 2014-06-17 05:03:21

+0

供参考:这个答案是从http://stackoverflow.com/questions/24255676/image-upload-with-diffrent-name – Shog9 2014-07-24 15:28:52

5

您应该使用tempnam()生成一个唯一的文件名:

// $baseDirectory Defines where the uploaded file will go to 
// $prefix   The first part of your file name, e.g. "image" 
$destinationFileName = tempnam($baseDirectory, $prefix); 

新文件的扩展名应该移动上传的文件后进行的,即:

// Assuming $_FILES['file']['error'] == 0 (no errors) 
if (move_uploaded_file($_FILES['file']['tmp_name'], $destinationFileName)) { 
    // use extension from uploaded file 
    $fileExtension = '.' . pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION); 
    // or fix the extension yourself 
    // $fileExtension = ".jpg"; 
    rename($destinationFileName, $destinationFileName . $fileExtension); 
} else { 
    // tempnam() created a new file, but moving the uploaded file failed 
    unlink($destinationFileName); // remove temporary file 
} 
+0

合并其创建.tmp文件 – user3726268 2014-06-17 04:51:19

+0

@ user3726268您可以执行重命名之后更改扩展名(或完全删除它)。 – 2014-06-17 04:52:22

+0

@ user3726268顺便说一下,执行'tempnam()'是唯一可以保证新文件名是唯一的(而不是随机)的方法。 – 2014-06-17 05:12:49