10/10/2018, 11:31

Hỏi về Upload PHP Duplicate va khoảng trắng

Tinh hình là mình có 1 đoạn upload php bên dưới, mình cũng chỉ mới học php thôi nên chỉ làm thêm phần Thump , Nhưng hiện tại còn 2 vấn đề mình chưa giải quyết được là khi up 2 file cùng tên thì nó sẽ xoá file cũ đè lên file mới . Mình đang tìm cách làm sao khi có file trùng lập thì nó sẽ có thêm số 1 2 3 ... phía sau. Và vấn đề thứ 2 là mình muốn xoá khoảng trắng của filename. Ví dụ nếu là "Picture 113" thì $_FILE['file'] sẽ là "Picture113"


Code hiện tại của mình
[/code]
<?php
$arrExt = array('jpg','gif','png');

// Ham tra ve dinh dang file getExt('mypicture.jpg') -> jpg

function getExt($filename){

return $ext = strtolower(substr(strrchr($filename, '.'), 1));
}

?>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="file" size="12"><br /><br /><input type="submit" value="Upload">
</form><br />&nbsp;

<?php

if($_FILES['file']){
$dir = ';
$thumb = $dir.'thumbs/';
$w = '100';
$h = '200';
$ext = getExt($_FILES['file']['name']);

if(in_array($ext, $arrExt)){
if(move_uploaded_file($_FILES['file']['tmp_name'], $dir.$_FILES['file']['name'])){
list($width, $height) = getimagesize($dir.$_FILES['file']['name']);

$image_p = imagecreatetruecolor($w, $h);
//

switch($ext){
case "jpg":
$image = imagecreatefromjpeg($dir.$_FILES['file']['name']);
break;

case "gif":
$image = imagecreatefromgif($dir.$_FILES['file']['name']);
break;

case "png":
$image = imagecreatefrompng($dir.$_FILES['file']['name']);
break;

default :
$image = imagecreatefromjpeg($dir.$_FILES['file']['name']);
break;
}
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $w, $h, $width, $height);
// Output & save to file
$thumb_file = 'thumb_'.$_FILES['file']['name'];
$tmp_content = imagejpeg($image_p, $thumb.$thumb_file, 100);[/code]
zmt264 viết 13:38 ngày 10/10/2018
1) kiểm tra file tồn tại hay ko bằng hàm bool file_exists ( string $filename )

2) cắt bỏ khoảng trắng bằng hàm: mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

Cụ thể preg_replace(" ","",$subject)
bad spy viết 13:37 ngày 10/10/2018
Mình biết hàm replace va check exist nhưng mà không biết ghép khúc nào luôn, mình replace cái file['name'] nó ra có khoảng trắng như cũ. Còn phần check exist thì có thể check nhưng để thêm 1 2 3 vào thì có cách nào khong bác. vd name_[$i] và i++
honnhienh viết 13:32 ngày 10/10/2018
đọc code bác thì thấy chắc là up hình. cái tên thì tốt nhất là bác rename nó khi lưu suống disk(ok)giống với cái id trong table là hay nhất cái tên của picture up lên thì bác luu vào trong database ở mục "real_name" chẳng hạn như zậy là giải quết song cái phần trùng tên cả khoảng trắng luôn. còn bác muốn cắt khoảng trăng rùi tên thêm vô gì đó thấy nó không ộn lắm vì lúc show ra cái tên bác sẽ lấy ở đâu ?
thuyduongcd viết 13:42 ngày 10/10/2018
Code:
//..............
// Output & save to file
$thumb_file = 'thumb_'.$_FILES['file']['name'];
$thumb_file=str_replace(" ","_",$thum_file);  // thay khoảng trắng bằng "_"
$i=1;
while (file_exists($thumb_file)){       //kiểm tra file có chưa, nếu có thì tăng thêm 1
    $p=strripos($thumb_file,".");  
    $thumb_file=substr($thumb_file,0,$p)."_$i".substr($thumb_file,$p);  
    $i++;
}
//............
bad spy viết 13:41 ngày 10/10/2018
Được gửi bởi honnhienh
đọc code bác thì thấy chắc là up hình. cái tên thì tốt nhất là bác rename nó khi lưu suống disk(ok)giống với cái id trong table là hay nhất cái tên của picture up lên thì bác luu vào trong database ở mục "real_name" chẳng hạn như zậy là giải quết song cái phần trùng tên cả khoảng trắng luôn. còn bác muốn cắt khoảng trăng rùi tên thêm vô gì đó thấy nó không ộn lắm vì lúc show ra cái tên bác sẽ lấy ở đâu ?
Ví dụ file mình là IMG 236 thì khi show ra cái ten la IMG246 . Mà vụ rename theo id cũng có vẻ .. hayhay . Nhưng chưa up vào db thì lay dau id ??

Code:
//..............
// Output & save to file
$thumb_file = 'thumb_'.$_FILES['file']['name'];
$thumb_file=str_replace(" ","_",$thum_file);  // thay khoảng trắng bằng "_"
$i=1;
while (file_exists($thumb_file)){       //kiểm tra file có chưa, nếu có thì tăng thêm 1
    $p=strripos($thumb_file,".");  
    $thumb_file=substr($thumb_file,0,$p)."_$i".substr($thumb_file,$p);  
    $i++;
}
//............
HOàn hảo, giải quyết được mục thump, còn mục main thì sao hả bác ?
honnhienh viết 13:46 ngày 10/10/2018
bác đọc quấn Beginning PHP 6, Apache, MySQL 6 Web Development thì sẽ rõ vẫn đề này.
thuyduongcd viết 13:32 ngày 10/10/2018
Mục main là mục gì? Chẳng phải chỉ có 2 vần đề đó thôi sao?
bad spy viết 13:35 ngày 10/10/2018
Được gửi bởi thuyduongcd
Mục main là mục gì? Chẳng phải chỉ có 2 vần đề đó thôi sao?
Khong , bạn hiểu sai ý mình 1 tý, code trên khi up 1 hình , nó sẽ ra 1 hình chính và 1 hình thumb o 2 folder khác nhau ! Bây giờ mình làm sao áp dụng 2 vấn đề đó cho cả main lẫn thumb ( remove space, add duplicate)

[=========> Bổ sung bài viết <=========]

Được gửi bởi honnhienh
bác đọc quấn Beginning PHP 6, Apache, MySQL 6 Web Development thì sẽ rõ vẫn đề này.
Minh đang nhai mấy mớ php 5.x basic
namduong8889 viết 13:34 ngày 10/10/2018
Code:
 Nhưng hiện tại còn 2 vấn đề mình chưa giải quyết được là khi up 2 file cùng tên thì nó sẽ xoá file cũ đè lên file mới
Hầu hết vấn đề upload vào chung một folder để tránh bị trùng tên, khi upload lên người ta sẽ tạo cho file upload một tên random chứ không giữ nguyên tên gốc. Hàm này sẽ giúp bạn trả về một chuỗi random từ a-z gồm 32 ký tự. Bạn nhớ cái phần mở rộng rồi ghép vào.

Code:
function ranchars($leng = 30, $onlynumber = false)
{
	if ($onlynumber) $myString = '1234567890';
	else $myString = '1234567890zxcvbnmasdfghjklpoiuytrewq';

	for ($i = 1; $i <= $leng; $i++) {
		$return .= $myString[ mt_rand(0 , strlen($myString)) ];
	}
	
	return $return;
}

Code:
1) kiểm tra file tồn tại hay ko bằng hàm bool file_exists ( string $filename )

2) cắt bỏ khoảng trắng bằng hàm: mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

Cụ thể preg_replace(" ","",$subject)
Không nên dùng preg_replace để thực hiện xóa khỏang trắng như vậy vì rất chậm. Dùng str_replace():

Code:
Khong , bạn hiểu sai ý mình 1 tý, code trên khi up 1 hình , nó sẽ ra 1 hình chính và 1 hình thumb o 2 folder khác nhau ! Bây giờ mình làm sao áp dụng 2 vấn đề đó cho cả main lẫn thumb ( remove space, add duplicate)
Việc này có hai cách làm:

1. Một là sau khi move_upload_file() thì tạo một file thumbnail luôn cho file đó. Đặt tên có prefix để truy xuất cho dễ. Ví dụ file gốc up lên là uploads/qwertyuuio28318iasdnasnido.jpg thì file thumbnail sẽ là uploads/thumb_qwertyuuio28318iasdnasnido.jpg; Object này sẽ giúp bạn tạo thumbnail cho ảnh mà không cần biết về các hàm xử lý ảnh của php http://www.white-hat-web-design.co.u...e-resizing.php

2. Hai là request đến đâu thì tạo thumbnail đến đó. Cách này nhanh hơn nhưng nặng server. Tiện cho ai lười, làm việc cần tốc độ hơn là performance. Sử dụng object này cho nhanh: http://shiftingpixel.com/2008/03/03/...image-resizer/
Bài liên quan
0