Possible Duplicate:
Clone + Rename file with PHP
This should be pretty easy. I wan't to copy & rename images that already exist on the server while still retaining the original image.
Here's the original image location:
images/
folder/
one.jpg
This is what I want:
images/
folder/
one.jpg
one_thumb.jpg
How can I achieve this? You can see I'm not just simply renaming an existing file / image. I want to copy it and rename it to the same directory.
asked Jul 11, 2012 at 22:58
4
Just use the copy method: //php.net/manual/en/function.copy.php
Ex:
The result of that script is that there will be a file $filename and also a $filename.old, e.g. c:\\windows\\myfile.txt and c:\\windows\\myfile.txt.old.
Author's Note: this function will not copy empty [zero-length] files - to do that, you need to use the function touch[].
Want to learn PHP 7?
Hacking with PHP has been fully updated for PHP 7, and is now available as a downloadable PDF. Get over 1200 pages of hands-on PHP learning today!
If this was helpful, please take a moment to tell others about Hacking with PHP by tweeting about it!
Next chapter: Deleting files with unlink[] >>
Previous chapter: Moving files with rename[]
Jump to:
Home: Table of Contents
Copyright ©2015 Paul Hudson. Follow me: @twostraws.
[PHP 4, PHP 5, PHP 7, PHP 8]
copy — Copies file
Description
copy[string $from
, string $to
, ?resource $context
= null
]: bool
If you wish to move a file, use the rename[] function.
Parameters
from
Path to the source file.
to
The destination path. If to
is a URL, the copy operation may fail if the wrapper does not support overwriting of existing files.
Warning
If the destination file already exists, it will be overwritten.
context
A valid context resource created with stream_context_create[].
Return Values
Returns true
on success or false
on failure.
Examples
Example #1 copy[] example
See Also
- move_uploaded_file[] - Moves an uploaded file to a new location
- rename[] - Renames a file or directory
- The section of the manual about handling file uploads
simonr_at_orangutan_dot_co_dot_uk ¶
18 years ago
Having spent hours tacking down a copy[] error: Permission denied , [and duly worrying about chmod on winXP] , its worth pointing out that the 'destination' needs to contain the actual file name ! --- NOT just the path to the folder you wish to copy into.......
DOH !
hope this saves somebody hours of fruitless debugging
cooper at asu dot ntu-kpi dot kiev dot ua ¶
16 years ago
It take me a long time to find out what the problem is when i've got an error on copy[]. It DOESN'T create any directories. It only copies to existing path. So create directories before. Hope i'll help,
steve a h ¶
14 years ago
Don't forget; you can use copy on remote files, rather than doing messy fopen stuff. e.g.
promaty at gmail dot com ¶
11 years ago
Here is a simple script that I use for removing and copying non-empty directories. Very useful when you are not sure what is the type of a file.
I am using these for managing folders and zip archives for my website plugins.
Cheers!
absorbentshoulderman at gmail dot com ¶
9 years ago
A nice simple trick if you need to make sure the folder exists first:
That simple.
ASchmidt at Anamera dot net ¶
8 years ago
Below a code snippet for downloading a file from a web server to a local file.
It demonstrates useful customizations of the request [such as setting a User-Agent and Referrer, often required by web sites], and how to download only files if the copy on the web site is newer than the local copy.
It further demonstrates the processing of response headers [if set by server] to determine the timestamp and file name. The file type is checked because some servers return a 200 OK return code with a textual "not found" page, instead of a proper 404 return code.
kadnan at yahoo dot com ¶
18 years ago
you can also try xcopy command by using Shell to move/copy files/folders from one place to another
here is the code:
by executing this command, it will move folder along with all contents to destination.
-adnan
allasso residing at signalmesa dot com ¶
13 years ago
As far as recursive copy, something like this seems to work fine for me:
Of course you need to get all your permissions clear. You can do the necessary stuff to use variables.
You could also do this to create the destination directory:
This will create a new directory called "dir_dest" if it does not already exist. This is a bit risky though if your situation is ambiguous, and you want to continue to make backups etc, 'cause if you do it twice you end up with:
dir_destination/dir_source
to avoid that one could do something like:
Maybe someone can tell me when or why it would be better to use all that PHP code I see here.
Vinicio Coletti ¶
6 years ago
Copying large files under Windows 8.1, from one NTFS filesystem to another NTFS filesystem, results in only the first 4 GiB copied and the rest of the file is ignored.
So, if you think to have files larger than 4 GiB, instead of doing:
copy[$source,$destination];
it is much better to do something like:
exec["xcopy $source $destination"];
I will check to see if this issue is valid also under Linux.
It depends on PHP not being compiled in 64 bit mode?
someone at terrasim dot com ¶
11 months ago
On Windows, php-7.4.19-Win32-vc15-x64 - copy[] corrupted a 6GB zip file. Our only recourse was to write:
function file_win_copy[ $src, $dst ] {
shell_exec[ 'COPY "'.$src.'" "'.$dst.'"'];
return file_exists[$dest];
}
jtaylor -at- ashevillenc -dot- com ¶
15 years ago
It seems as though you can only use move_uploaded_file[] once on a temporary file that has been uploaded through a form. Most likely the action this function takes destroys the temporary file after it has been moved, assuming permanent placement on a file system.
Attempting to use the function again in the same PHP script will return false and not move the file.
I ran into this when an image that was uploaded did not need resizing [smaller than a size threshold] and after moving the temporary upload to the "originals" directory, an attempt was made to again move the temporary file to another folder.
This behavior is understandable, but be careful - in this instance, I simply used copy[] on the file that was already uploaded.
nensa at zeec dot biz ¶
13 years ago
When I recently had to copy a few millions of small files [< 1kb] from one NAS to another and for some reasons had to do that file by file I compared the following function with copy[$src, $dest] and shell_exec["cp -r $src $dest"].
Surprisingly stream_copy seamed to be slightly faster [at least in this specific context].
Bas Vijfwinkel ¶
7 years ago
Paths and filenames with Japanese characters are not handled correctly if you are running Apache/PHP on a Windows machine.
With the following code you can convert e.g. the network path to the appropriate encoding so that Windows understands where to look:
There are however a number of characters that cannot be converted correctly like '②' and '﨑' because there are no SJIS equivalents.
cory at veck dot ca ¶
11 years ago
My own 'cp -R' written in PHP.
Hopefully it will work for your situation. I'm using it in a web based file manager for my CMS.
mishawagon at gmail dot com ¶
3 years ago
Copy failed for me until I added dirname[__FILE__] to the file paths.
copy[dirname[__FILE__].$tempdata,dirname[__FILE__].$filepath]
mspreij ¶
15 years ago
This function creates a new filename to use for a copy of the given filename, its behaviour was mostly sto^Wborrowed from how the OS X Finder [*1] does it.
Note it *doesn't* actually copy the file, it just returns the new name. I needed it to work regardless of data source [filesystem, ftp, etc].
It also tries to match the current name as neatly as possible:
foo.txt -> foo copy.txt -> foo copy 1.txt -> foo copy 2.txt [etc]
foo.bar.baz.jpg -> foo.bar.baz copy.jpg
foobar -> foobar copy -> foobar copy 1 [etc]
".txt" -> .txt copy, and "txt." -> txt. copy
file.longextension -> file.longextension copy
It keeps trying until it finds a name that is not yet taken in $list, or until it looped 500 times [change as needed].
If the renamed file becomes longer than max filename length, it starts chopping away at the end of the part before where it adds " copy": reallylong...filename.txt -> reallylong...filena copy.txt