CodeIgniter4/libraries/uploaded_files.html
2025-02-07 17:48:15 +00:00

876 lines
71 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html class="writer-html5" lang="en">
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Working with Uploaded Files &mdash; CodeIgniter 4.6.0 documentation</title>
<link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../_static/css/citheme.css" />
<link rel="stylesheet" type="text/css" href="../_static/css/citheme_dark.css" />
<link rel="shortcut icon" href="../_static/favicon.ico"/>
<!--[if lt IE 9]>
<script src="../_static/js/html5shiv.min.js"></script>
<![endif]-->
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<script src="../_static/js/citheme.js"></script>
<script src="../_static/js/carbon.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Working with URIs" href="uri.html" />
<link rel="prev" title="Typography" href="typography.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html">
<img src="../_static/ci-logo-text.svg" class="logo" alt="Logo"/>
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<ul>
<li class="toctree-l1"><a class="reference internal" href="../intro/index.html">Welcome to CodeIgniter4</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../intro/index.html">Welcome to CodeIgniter4</a></li>
<li class="toctree-l2"><a class="reference internal" href="../intro/requirements.html">Server Requirements</a></li>
<li class="toctree-l2"><a class="reference internal" href="../intro/credits.html">Credits</a></li>
<li class="toctree-l2"><a class="reference internal" href="../intro/psr.html">PSR Compliance</a></li>
<li class="toctree-l2"><a class="reference internal" href="../license.html">License Agreement</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../installation/index.html">Installation</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../installation/installing_composer.html">Composer Installation</a></li>
<li class="toctree-l2"><a class="reference internal" href="../installation/installing_manual.html">Manual Installation</a></li>
<li class="toctree-l2"><a class="reference internal" href="../installation/running.html">Running Your App</a></li>
<li class="toctree-l2"><a class="reference internal" href="../installation/troubleshooting.html">Troubleshooting</a></li>
<li class="toctree-l2"><a class="reference internal" href="../installation/deployment.html">Deployment</a></li>
<li class="toctree-l2"><a class="reference internal" href="../changelogs/index.html">Change Logs</a></li>
<li class="toctree-l2"><a class="reference internal" href="../installation/upgrading.html">Upgrading From a Previous Version</a></li>
<li class="toctree-l2"><a class="reference internal" href="../installation/repositories.html">CodeIgniter Repositories</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../tutorial/index.html">Build Your First Application</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../tutorial/static_pages.html">Static Pages</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tutorial/news_section.html">News Section</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tutorial/create_news_items.html">Create News Items</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tutorial/conclusion.html">Conclusion</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../concepts/index.html">CodeIgniter4 Overview</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../concepts/structure.html">Application Structure</a></li>
<li class="toctree-l2"><a class="reference internal" href="../concepts/mvc.html">Models, Views, and Controllers</a></li>
<li class="toctree-l2"><a class="reference internal" href="../concepts/autoloader.html">Autoloading Files</a></li>
<li class="toctree-l2"><a class="reference internal" href="../concepts/services.html">Services</a></li>
<li class="toctree-l2"><a class="reference internal" href="../concepts/factories.html">Factories</a></li>
<li class="toctree-l2"><a class="reference internal" href="../concepts/http.html">Working with HTTP Requests</a></li>
<li class="toctree-l2"><a class="reference internal" href="../concepts/security.html">Security Guidelines</a></li>
<li class="toctree-l2"><a class="reference internal" href="../concepts/goals.html">Design and Architectural Goals</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../general/index.html">General Topics</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../general/configuration.html">Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../general/urls.html">CodeIgniter URLs</a></li>
<li class="toctree-l2"><a class="reference internal" href="../general/helpers.html">Helper Functions</a></li>
<li class="toctree-l2"><a class="reference internal" href="../general/common_functions.html">Global Functions and Constants</a></li>
<li class="toctree-l2"><a class="reference internal" href="../general/logging.html">Logging Information</a></li>
<li class="toctree-l2"><a class="reference internal" href="../general/errors.html">Error Handling</a></li>
<li class="toctree-l2"><a class="reference internal" href="../general/caching.html">Web Page Caching</a></li>
<li class="toctree-l2"><a class="reference internal" href="../general/ajax.html">AJAX Requests</a></li>
<li class="toctree-l2"><a class="reference internal" href="../general/modules.html">Code Modules</a></li>
<li class="toctree-l2"><a class="reference internal" href="../general/managing_apps.html">Managing your Applications</a></li>
<li class="toctree-l2"><a class="reference internal" href="../general/environments.html">Handling Multiple Environments</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../incoming/index.html">Controllers and Routing</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../incoming/routing.html">URI Routing</a></li>
<li class="toctree-l2"><a class="reference internal" href="../incoming/controllers.html">Controllers</a></li>
<li class="toctree-l2"><a class="reference internal" href="../incoming/filters.html">Controller Filters</a></li>
<li class="toctree-l2"><a class="reference internal" href="../incoming/auto_routing_improved.html">Auto Routing (Improved)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../incoming/message.html">HTTP Messages</a></li>
<li class="toctree-l2"><a class="reference internal" href="../incoming/request.html">Request Class</a></li>
<li class="toctree-l2"><a class="reference internal" href="../incoming/incomingrequest.html">IncomingRequest Class</a></li>
<li class="toctree-l2"><a class="reference internal" href="../incoming/content_negotiation.html">Content Negotiation</a></li>
<li class="toctree-l2"><a class="reference internal" href="../incoming/methodspoofing.html">HTTP Method Spoofing</a></li>
<li class="toctree-l2"><a class="reference internal" href="../incoming/restful.html">RESTful Resource Handling</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../outgoing/index.html">Building Responses</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../outgoing/views.html">Views</a></li>
<li class="toctree-l2"><a class="reference internal" href="../outgoing/view_renderer.html">View Renderer</a></li>
<li class="toctree-l2"><a class="reference internal" href="../outgoing/view_layouts.html">View Layouts</a></li>
<li class="toctree-l2"><a class="reference internal" href="../outgoing/view_cells.html">View Cells</a></li>
<li class="toctree-l2"><a class="reference internal" href="../outgoing/view_parser.html">View Parser</a></li>
<li class="toctree-l2"><a class="reference internal" href="../outgoing/view_decorators.html">View Decorators</a></li>
<li class="toctree-l2"><a class="reference internal" href="../outgoing/table.html">HTML Table Class</a></li>
<li class="toctree-l2"><a class="reference internal" href="../outgoing/response.html">HTTP Responses</a></li>
<li class="toctree-l2"><a class="reference internal" href="../outgoing/api_responses.html">API Response Trait</a></li>
<li class="toctree-l2"><a class="reference internal" href="../outgoing/csp.html">Content Security Policy</a></li>
<li class="toctree-l2"><a class="reference internal" href="../outgoing/localization.html">Localization</a></li>
<li class="toctree-l2"><a class="reference internal" href="../outgoing/alternative_php.html">Alternate PHP Syntax for View Files</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../database/index.html">Working with Databases</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../database/examples.html">Quick Start: Usage Examples</a></li>
<li class="toctree-l2"><a class="reference internal" href="../database/configuration.html">Database Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../database/connecting.html">Connecting to a Database</a></li>
<li class="toctree-l2"><a class="reference internal" href="../database/queries.html">Running Queries</a></li>
<li class="toctree-l2"><a class="reference internal" href="../database/results.html">Generating Query Results</a></li>
<li class="toctree-l2"><a class="reference internal" href="../database/helpers.html">Query Helper Methods</a></li>
<li class="toctree-l2"><a class="reference internal" href="../database/query_builder.html">Query Builder Class</a></li>
<li class="toctree-l2"><a class="reference internal" href="../database/transactions.html">Transactions</a></li>
<li class="toctree-l2"><a class="reference internal" href="../database/metadata.html">Getting Metadata</a></li>
<li class="toctree-l2"><a class="reference internal" href="../database/call_function.html">Custom Function Calls</a></li>
<li class="toctree-l2"><a class="reference internal" href="../database/events.html">Database Events</a></li>
<li class="toctree-l2"><a class="reference internal" href="../database/utilities.html">Database Utilities</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../models/index.html">Modeling Data</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../models/model.html">Using CodeIgniter's Model</a></li>
<li class="toctree-l2"><a class="reference internal" href="../models/entities.html">Using Entity Classes</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../dbmgmt/index.html">Managing Databases</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../dbmgmt/forge.html">Database Forge</a></li>
<li class="toctree-l2"><a class="reference internal" href="../dbmgmt/migration.html">Database Migrations</a></li>
<li class="toctree-l2"><a class="reference internal" href="../dbmgmt/seeds.html">Database Seeding</a></li>
<li class="toctree-l2"><a class="reference internal" href="../dbmgmt/db_commands.html">Database Commands</a></li>
</ul>
</li>
</ul>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="index.html">Library Reference</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="caching.html">Caching Driver</a></li>
<li class="toctree-l2"><a class="reference internal" href="cookies.html">Cookies</a></li>
<li class="toctree-l2"><a class="reference internal" href="cors.html">Cross-Origin Resource Sharing (CORS)</a></li>
<li class="toctree-l2"><a class="reference internal" href="curlrequest.html">CURLRequest Class</a></li>
<li class="toctree-l2"><a class="reference internal" href="email.html">Email Class</a></li>
<li class="toctree-l2"><a class="reference internal" href="encryption.html">Encryption Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="files.html">Working with Files</a></li>
<li class="toctree-l2"><a class="reference internal" href="file_collections.html">File Collections</a></li>
<li class="toctree-l2"><a class="reference internal" href="honeypot.html">Honeypot Class</a></li>
<li class="toctree-l2"><a class="reference internal" href="images.html">Image Manipulation Class</a></li>
<li class="toctree-l2"><a class="reference internal" href="pagination.html">Pagination</a></li>
<li class="toctree-l2"><a class="reference internal" href="publisher.html">Publisher</a></li>
<li class="toctree-l2"><a class="reference internal" href="security.html">Security</a></li>
<li class="toctree-l2"><a class="reference internal" href="sessions.html">Session Library</a></li>
<li class="toctree-l2"><a class="reference internal" href="throttler.html">Throttler</a></li>
<li class="toctree-l2"><a class="reference internal" href="time.html">Times and Dates</a></li>
<li class="toctree-l2"><a class="reference internal" href="typography.html">Typography</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Working with Uploaded Files</a></li>
<li class="toctree-l2"><a class="reference internal" href="uri.html">Working with URIs</a></li>
<li class="toctree-l2"><a class="reference internal" href="user_agent.html">User Agent Class</a></li>
<li class="toctree-l2"><a class="reference internal" href="validation.html">Validation</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../helpers/index.html">Helpers</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../helpers/array_helper.html">Array Helper</a></li>
<li class="toctree-l2"><a class="reference internal" href="../helpers/cookie_helper.html">Cookie Helper</a></li>
<li class="toctree-l2"><a class="reference internal" href="../helpers/date_helper.html">Date Helper</a></li>
<li class="toctree-l2"><a class="reference internal" href="../helpers/filesystem_helper.html">Filesystem Helper</a></li>
<li class="toctree-l2"><a class="reference internal" href="../helpers/form_helper.html">Form Helper</a></li>
<li class="toctree-l2"><a class="reference internal" href="../helpers/html_helper.html">HTML Helper</a></li>
<li class="toctree-l2"><a class="reference internal" href="../helpers/inflector_helper.html">Inflector Helper</a></li>
<li class="toctree-l2"><a class="reference internal" href="../helpers/number_helper.html">Number Helper</a></li>
<li class="toctree-l2"><a class="reference internal" href="../helpers/security_helper.html">Security Helper</a></li>
<li class="toctree-l2"><a class="reference internal" href="../helpers/test_helper.html">Test Helper</a></li>
<li class="toctree-l2"><a class="reference internal" href="../helpers/text_helper.html">Text Helper</a></li>
<li class="toctree-l2"><a class="reference internal" href="../helpers/url_helper.html">URL Helper</a></li>
<li class="toctree-l2"><a class="reference internal" href="../helpers/xml_helper.html">XML Helper</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../testing/index.html">Testing</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../testing/overview.html">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../testing/database.html">Database</a></li>
<li class="toctree-l2"><a class="reference internal" href="../testing/fabricator.html">Generating Data</a></li>
<li class="toctree-l2"><a class="reference internal" href="../testing/controllers.html">Controller Testing</a></li>
<li class="toctree-l2"><a class="reference internal" href="../testing/feature.html">HTTP Testing</a></li>
<li class="toctree-l2"><a class="reference internal" href="../testing/response.html">Testing Responses</a></li>
<li class="toctree-l2"><a class="reference internal" href="../testing/cli.html">Testing CLI Commands</a></li>
<li class="toctree-l2"><a class="reference internal" href="../testing/mocking.html">Mocking</a></li>
<li class="toctree-l2"><a class="reference internal" href="../testing/benchmark.html">Benchmarking</a></li>
<li class="toctree-l2"><a class="reference internal" href="../testing/debugging.html">Debugging Your Application</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../cli/index.html">Command Line Usage</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../cli/cli_overview.html">CLI Overview</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cli/cli_controllers.html">Running Controllers via CLI</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cli/spark_commands.html">Spark Commands</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cli/cli_commands.html">Creating Spark Commands</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cli/cli_generators.html">CLI Generators</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cli/cli_library.html">CLI Library</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cli/cli_request.html">CLIRequest Class</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../extending/index.html">Extending CodeIgniter</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../extending/core_classes.html">Creating Core System Classes</a></li>
<li class="toctree-l2"><a class="reference internal" href="../extending/common.html">Replacing Common Functions</a></li>
<li class="toctree-l2"><a class="reference internal" href="../extending/events.html">Events</a></li>
<li class="toctree-l2"><a class="reference internal" href="../extending/basecontroller.html">Extending the Controller</a></li>
<li class="toctree-l2"><a class="reference internal" href="../extending/authentication.html">Authentication</a></li>
<li class="toctree-l2"><a class="reference internal" href="../extending/composer_packages.html">Creating Composer Packages</a></li>
<li class="toctree-l2"><a class="reference internal" href="../extending/contributing.html">Contributing to CodeIgniter</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="official_packages.html">Official Packages</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">CodeIgniter</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<a class="btn btn-neutral float-right" href="https://github.com/codeigniter4/CodeIgniter4/edit/develop/user_guide_src/source/libraries/uploaded_files.rst">Edit this page</a>
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="index.html">Library Reference</a></li>
<li class="breadcrumb-item active">Working with Uploaded Files</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="working-with-uploaded-files">
<h1>Working with Uploaded Files<a class="headerlink" href="#working-with-uploaded-files" title="Permalink to this heading"></a></h1>
<p>CodeIgniter makes working with files uploaded through a form much simpler and
more secure than using PHPs <code class="docutils literal notranslate"><span class="pre">$_FILES</span></code> array directly. This extends the
<a class="reference internal" href="files.html"><span class="doc">File class</span></a> and thus gains all of the features of that
class.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>This is not the same as the File Uploading class in CodeIgniter 3.
This provides a raw interface to the uploaded files with a few small features.</p>
</div>
<nav class="contents local" id="contents">
<ul class="simple">
<li><p><a class="reference internal" href="#file-upload-form-tutorial" id="id3">File Upload Form Tutorial</a></p>
<ul>
<li><p><a class="reference internal" href="#creating-the-upload-form" id="id4">Creating the Upload Form</a></p></li>
<li><p><a class="reference internal" href="#the-success-page" id="id5">The Success Page</a></p></li>
<li><p><a class="reference internal" href="#the-controller" id="id6">The Controller</a></p></li>
<li><p><a class="reference internal" href="#the-routes" id="id7">The Routes</a></p></li>
<li><p><a class="reference internal" href="#the-upload-directory" id="id8">The Upload Directory</a></p></li>
<li><p><a class="reference internal" href="#try-it" id="id9">Try it!</a></p></li>
</ul>
</li>
<li><p><a class="reference internal" href="#accessing-files" id="id10">Accessing Files</a></p>
<ul>
<li><p><a class="reference internal" href="#all-files" id="id11">All Files</a></p></li>
<li><p><a class="reference internal" href="#single-file" id="id12">Single File</a></p></li>
<li><p><a class="reference internal" href="#multiple-files" id="id13">Multiple files</a></p></li>
</ul>
</li>
<li><p><a class="reference internal" href="#working-with-the-file" id="id14">Working with the File</a></p>
<ul>
<li><p><a class="reference internal" href="#verify-a-file" id="id15">Verify a File</a></p></li>
<li><p><a class="reference internal" href="#file-names" id="id16">File Names</a></p></li>
<li><p><a class="reference internal" href="#other-file-info" id="id17">Other File Info</a></p></li>
<li><p><a class="reference internal" href="#moving-files" id="id18">Moving Files</a></p></li>
<li><p><a class="reference internal" href="#store-files" id="id19">Store Files</a></p></li>
</ul>
</li>
</ul>
</nav>
<section id="file-upload-form-tutorial">
<span id="id1"></span><h2><a class="toc-backref" href="#id3" role="doc-backlink">File Upload Form Tutorial</a><a class="headerlink" href="#file-upload-form-tutorial" title="Permalink to this heading"></a></h2>
<p>Uploading a file involves the following general process:</p>
<ul class="simple">
<li><p>An upload form is displayed, allowing a user to select a file and
upload it.</p></li>
<li><p>When the form is submitted, the file is uploaded to the destination
you specify.</p></li>
<li><p>Along the way, the file is validated to make sure it is allowed to be
uploaded based on the preferences you set.</p></li>
<li><p>Once uploaded, the user will be shown a success message.</p></li>
</ul>
<p>To demonstrate this process here is a brief tutorial. Afterward youll
find reference information.</p>
<section id="creating-the-upload-form">
<h3><a class="toc-backref" href="#id4" role="doc-backlink">Creating the Upload Form</a><a class="headerlink" href="#creating-the-upload-form" title="Permalink to this heading"></a></h3>
<p>Using a text editor, create a form called <strong>upload_form.php</strong>. In it, place
this code and save it to your <strong>app/Views</strong> directory:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;!</span><span class="nx">DOCTYPE</span> <span class="nx">html</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="nx">html</span> <span class="nx">lang</span><span class="o">=</span><span class="s2">&quot;en&quot;</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="nx">head</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="nx">title</span><span class="o">&gt;</span><span class="nx">Upload</span> <span class="nx">Form</span><span class="o">&lt;/</span><span class="nx">title</span><span class="o">&gt;</span>
<span class="o">&lt;/</span><span class="nx">head</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="nx">body</span><span class="o">&gt;</span>
<span class="o">&lt;?</span><span class="nx">php</span> <span class="k">foreach</span> <span class="p">(</span><span class="nv">$errors</span> <span class="k">as</span> <span class="nv">$error</span><span class="p">)</span><span class="o">:</span> <span class="cp">?&gt;</span>
<span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span><span class="cp">&lt;?</span><span class="o">=</span> <span class="nx">esc</span><span class="p">(</span><span class="nv">$error</span><span class="p">)</span> <span class="cp">?&gt;</span><span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
<span class="cp">&lt;?php</span> <span class="k">endforeach</span> <span class="cp">?&gt;</span>
<span class="cp">&lt;?</span><span class="o">=</span> <span class="nx">form_open_multipart</span><span class="p">(</span><span class="s1">&#39;upload/upload&#39;</span><span class="p">)</span> <span class="cp">?&gt;</span>
<span class="p">&lt;</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;file&quot;</span> <span class="na">name</span><span class="o">=</span><span class="s">&quot;userfile&quot;</span> <span class="na">size</span><span class="o">=</span><span class="s">&quot;20&quot;</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">br</span><span class="p">&gt;&lt;</span><span class="nt">br</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;submit&quot;</span> <span class="na">value</span><span class="o">=</span><span class="s">&quot;upload&quot;</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="nt">form</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="nt">body</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="nt">html</span><span class="p">&gt;</span>
</pre></div>
</div>
<p>Youll notice we are using a form helper to create the opening form tag.
File uploads require a multipart form, so the helper creates the proper
syntax for you.</p>
<p>Youll also notice we have an <code class="docutils literal notranslate"><span class="pre">$errors</span></code> variable. This is
so we can show error messages in the event the user does something
wrong.</p>
</section>
<section id="the-success-page">
<h3><a class="toc-backref" href="#id5" role="doc-backlink">The Success Page</a><a class="headerlink" href="#the-success-page" title="Permalink to this heading"></a></h3>
<p>Using a text editor, create a form called <strong>upload_success.php</strong>. In it,
place this code and save it to your <strong>app/Views</strong> directory:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;!</span><span class="nx">DOCTYPE</span> <span class="nx">html</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="nx">html</span> <span class="nx">lang</span><span class="o">=</span><span class="s2">&quot;en&quot;</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="nx">head</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="nx">title</span><span class="o">&gt;</span><span class="nx">Upload</span> <span class="nx">Form</span><span class="o">&lt;/</span><span class="nx">title</span><span class="o">&gt;</span>
<span class="o">&lt;/</span><span class="nx">head</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="nx">body</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="nx">h3</span><span class="o">&gt;</span><span class="nx">Your</span> <span class="nb">file</span> <span class="nx">was</span> <span class="nx">successfully</span> <span class="nx">uploaded</span><span class="o">!&lt;/</span><span class="nx">h3</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="nx">ul</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="nx">li</span><span class="o">&gt;</span><span class="nx">name</span><span class="o">:</span> <span class="o">&lt;?=</span> <span class="nx">esc</span><span class="p">(</span><span class="nv">$uploaded_fileinfo</span><span class="o">-&gt;</span><span class="na">getBasename</span><span class="p">())</span> <span class="cp">?&gt;</span><span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span>size: <span class="cp">&lt;?</span><span class="o">=</span> <span class="nx">esc</span><span class="p">(</span><span class="nv">$uploaded_fileinfo</span><span class="o">-&gt;</span><span class="na">getSizeByUnit</span><span class="p">(</span><span class="s1">&#39;kb&#39;</span><span class="p">))</span> <span class="cp">?&gt;</span> KB<span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span>extension: <span class="cp">&lt;?</span><span class="o">=</span> <span class="nx">esc</span><span class="p">(</span><span class="nv">$uploaded_fileinfo</span><span class="o">-&gt;</span><span class="na">guessExtension</span><span class="p">())</span> <span class="cp">?&gt;</span><span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span><span class="cp">&lt;?</span><span class="o">=</span> <span class="nx">anchor</span><span class="p">(</span><span class="s1">&#39;upload&#39;</span><span class="p">,</span> <span class="s1">&#39;Upload Another File!&#39;</span><span class="p">)</span> <span class="cp">?&gt;</span><span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="nt">body</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="nt">html</span><span class="p">&gt;</span>
</pre></div>
</div>
</section>
<section id="the-controller">
<h3><a class="toc-backref" href="#id6" role="doc-backlink">The Controller</a><a class="headerlink" href="#the-controller" title="Permalink to this heading"></a></h3>
<p>Using a text editor, create a controller called <strong>Upload.php</strong>. In it, place
this code and save it to your <strong>app/Controllers</strong> directory:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="k">namespace</span> <span class="nx">App\Controllers</span><span class="p">;</span>
<span class="k">use</span> <span class="nx">CodeIgniter\Files\File</span><span class="p">;</span>
<span class="k">class</span> <span class="nc">Upload</span> <span class="k">extends</span> <span class="nx">BaseController</span>
<span class="p">{</span>
<span class="k">protected</span> <span class="nv">$helpers</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;form&#39;</span><span class="p">];</span>
<span class="k">public</span> <span class="k">function</span> <span class="nf">index</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">return</span> <span class="nx">view</span><span class="p">(</span><span class="s1">&#39;upload_form&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;errors&#39;</span> <span class="o">=&gt;</span> <span class="p">[]]);</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">function</span> <span class="nf">upload</span><span class="p">()</span>
<span class="p">{</span>
<span class="nv">$validationRule</span> <span class="o">=</span> <span class="p">[</span>
<span class="s1">&#39;userfile&#39;</span> <span class="o">=&gt;</span> <span class="p">[</span>
<span class="s1">&#39;label&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;Image File&#39;</span><span class="p">,</span>
<span class="s1">&#39;rules&#39;</span> <span class="o">=&gt;</span> <span class="p">[</span>
<span class="s1">&#39;uploaded[userfile]&#39;</span><span class="p">,</span>
<span class="s1">&#39;is_image[userfile]&#39;</span><span class="p">,</span>
<span class="s1">&#39;mime_in[userfile,image/jpg,image/jpeg,image/gif,image/png,image/webp]&#39;</span><span class="p">,</span>
<span class="s1">&#39;max_size[userfile,100]&#39;</span><span class="p">,</span>
<span class="s1">&#39;max_dims[userfile,1024,768]&#39;</span><span class="p">,</span>
<span class="p">],</span>
<span class="p">],</span>
<span class="p">];</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">validateData</span><span class="p">([],</span> <span class="nv">$validationRule</span><span class="p">))</span> <span class="p">{</span>
<span class="nv">$data</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;errors&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">validator</span><span class="o">-&gt;</span><span class="na">getErrors</span><span class="p">()];</span>
<span class="k">return</span> <span class="nx">view</span><span class="p">(</span><span class="s1">&#39;upload_form&#39;</span><span class="p">,</span> <span class="nv">$data</span><span class="p">);</span>
<span class="p">}</span>
<span class="nv">$img</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">getFile</span><span class="p">(</span><span class="s1">&#39;userfile&#39;</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span> <span class="nv">$img</span><span class="o">-&gt;</span><span class="na">hasMoved</span><span class="p">())</span> <span class="p">{</span>
<span class="nv">$filepath</span> <span class="o">=</span> <span class="nx">WRITEPATH</span> <span class="o">.</span> <span class="s1">&#39;uploads/&#39;</span> <span class="o">.</span> <span class="nv">$img</span><span class="o">-&gt;</span><span class="na">store</span><span class="p">();</span>
<span class="nv">$data</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;uploaded_fileinfo&#39;</span> <span class="o">=&gt;</span> <span class="k">new</span> <span class="nx">File</span><span class="p">(</span><span class="nv">$filepath</span><span class="p">)];</span>
<span class="k">return</span> <span class="nx">view</span><span class="p">(</span><span class="s1">&#39;upload_success&#39;</span><span class="p">,</span> <span class="nv">$data</span><span class="p">);</span>
<span class="p">}</span>
<span class="nv">$data</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;errors&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;The file has already been moved.&#39;</span><span class="p">];</span>
<span class="k">return</span> <span class="nx">view</span><span class="p">(</span><span class="s1">&#39;upload_form&#39;</span><span class="p">,</span> <span class="nv">$data</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<p>Only the <a class="reference internal" href="validation.html#rules-for-file-uploads"><span class="std std-ref">Rules for File Uploads</span></a> can be used to validate uploaded files.</p>
<p>Therefore, the rule <code class="docutils literal notranslate"><span class="pre">required</span></code> cannot be used either, so if the file is required,
use the rule <code class="docutils literal notranslate"><span class="pre">uploaded</span></code> instead.</p>
<p>Note that an empty array (<code class="docutils literal notranslate"><span class="pre">[]</span></code>) is passed as the first argument to
<code class="docutils literal notranslate"><span class="pre">$this-&gt;validateData()</span></code>. It is because the file validation rules get the data
for the uploaded file directly from the Request object.</p>
<p>If the form has fields other than file upload, pass the field data as the first
argument.</p>
</section>
<section id="the-routes">
<h3><a class="toc-backref" href="#id7" role="doc-backlink">The Routes</a><a class="headerlink" href="#the-routes" title="Permalink to this heading"></a></h3>
<p>Using a text editor, open <strong>app/Config/Routes.php</strong>. In it, add the following two routes:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="c1">// ...</span>
<span class="cm">/*</span>
<span class="cm"> * --------------------------------------------------------------------</span>
<span class="cm"> * Route Definitions</span>
<span class="cm"> * --------------------------------------------------------------------</span>
<span class="cm"> */</span>
<span class="c1">// We get a performance increase by specifying the default</span>
<span class="c1">// route since we don&#39;t have to scan directories.</span>
<span class="nv">$routes</span><span class="o">-&gt;</span><span class="na">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;Home::index&#39;</span><span class="p">);</span>
<span class="nv">$routes</span><span class="o">-&gt;</span><span class="na">get</span><span class="p">(</span><span class="s1">&#39;upload&#39;</span><span class="p">,</span> <span class="s1">&#39;Upload::index&#39;</span><span class="p">);</span> <span class="c1">// Add this line.</span>
<span class="nv">$routes</span><span class="o">-&gt;</span><span class="na">post</span><span class="p">(</span><span class="s1">&#39;upload/upload&#39;</span><span class="p">,</span> <span class="s1">&#39;Upload::upload&#39;</span><span class="p">);</span> <span class="c1">// Add this line.</span>
<span class="c1">// ...</span>
</pre></div>
</div>
</section>
<section id="the-upload-directory">
<h3><a class="toc-backref" href="#id8" role="doc-backlink">The Upload Directory</a><a class="headerlink" href="#the-upload-directory" title="Permalink to this heading"></a></h3>
<p>The uploaded files are stored in the <strong>writable/uploads/</strong> directory.</p>
</section>
<section id="try-it">
<h3><a class="toc-backref" href="#id9" role="doc-backlink">Try it!</a><a class="headerlink" href="#try-it" title="Permalink to this heading"></a></h3>
<p>To try your form, visit your site using a URL similar to this one:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="nx">example</span><span class="o">.</span><span class="nx">com</span><span class="o">/</span><span class="nx">index</span><span class="o">.</span><span class="nx">php</span><span class="o">/</span><span class="nx">upload</span><span class="o">/</span>
</pre></div>
</div>
<p>You should see an upload form. Try uploading an image file (either a
<strong>jpg</strong>, <strong>gif</strong>, <strong>png</strong>, or <strong>webp</strong>). If the path in your controller is correct it should
work.</p>
</section>
</section>
<section id="accessing-files">
<span id="uploaded-files-accessing-files"></span><h2><a class="toc-backref" href="#id10" role="doc-backlink">Accessing Files</a><a class="headerlink" href="#accessing-files" title="Permalink to this heading"></a></h2>
<section id="all-files">
<h3><a class="toc-backref" href="#id11" role="doc-backlink">All Files</a><a class="headerlink" href="#all-files" title="Permalink to this heading"></a></h3>
<p>When you upload files they can be accessed natively in PHP through the <code class="docutils literal notranslate"><span class="pre">$_FILES</span></code> superglobal. This array has some
major shortcomings when working with multiple files uploaded at once, and has potential security flaws many developers
are not aware of. CodeIgniter helps with both of these situations by standardizing your usage of files behind a
common interface.</p>
<p>Files are accessed through the current <code class="docutils literal notranslate"><span class="pre">IncomingRequest</span></code> instance. To retrieve all files that were uploaded with this
request, use <code class="docutils literal notranslate"><span class="pre">getFiles()</span></code>. This will return an array of files represented by instances of <code class="docutils literal notranslate"><span class="pre">CodeIgniter\HTTP\Files\UploadedFile</span></code>:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="nv">$files</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">getFiles</span><span class="p">();</span>
</pre></div>
</div>
<p>Of course, there are multiple ways to name the file input, and anything but the simplest can create strange results.
The array returns in a manner that you would expect. With the simplest usage, a single file might be submitted like:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;file&quot;</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;avatar&quot;</span><span class="o">&gt;</span>
</pre></div>
</div>
<p>Which would return a simple array like:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="p">[</span>
<span class="s1">&#39;avatar&#39;</span> <span class="o">=&gt;</span> <span class="c1">// UploadedFile instance,</span>
<span class="p">];</span>
</pre></div>
</div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>The UploadedFile instance corresponds to <code class="docutils literal notranslate"><span class="pre">$_FILES</span></code>. Even if a user just clicks the submit button and does not upload any file, the instance will still exist. You can check that the file was actually uploaded by the <code class="docutils literal notranslate"><span class="pre">isValid()</span></code> method in UploadedFile. See <a class="reference internal" href="#verify-a-file"><span class="std std-ref">Verify a File</span></a>.</p>
</div>
<p>If you used an array notation for the name, the input would look something like:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;file&quot;</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;my-form[details][avatar]&quot;</span><span class="o">&gt;</span>
</pre></div>
</div>
<p>The array returned by <code class="docutils literal notranslate"><span class="pre">getFiles()</span></code> would look more like this:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="p">[</span>
<span class="s1">&#39;my-form&#39;</span> <span class="o">=&gt;</span> <span class="p">[</span>
<span class="s1">&#39;details&#39;</span> <span class="o">=&gt;</span> <span class="p">[</span>
<span class="s1">&#39;avatar&#39;</span> <span class="o">=&gt;</span> <span class="c1">// UploadedFile instance</span>
<span class="p">],</span>
<span class="p">],</span>
<span class="p">]</span>
</pre></div>
</div>
<p>In some cases, you may specify an array of files to upload:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="nx">Upload</span> <span class="nx">an</span> <span class="nx">avatar</span><span class="o">:</span> <span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;file&quot;</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;my-form[details][avatars][]&quot;</span><span class="o">&gt;</span>
<span class="nx">Upload</span> <span class="nx">an</span> <span class="nx">avatar</span><span class="o">:</span> <span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;file&quot;</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;my-form[details][avatars][]&quot;</span><span class="o">&gt;</span>
</pre></div>
</div>
<p>In this case, the returned array of files would be more like:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="p">[</span>
<span class="s1">&#39;my-form&#39;</span> <span class="o">=&gt;</span> <span class="p">[</span>
<span class="s1">&#39;details&#39;</span> <span class="o">=&gt;</span> <span class="p">[</span>
<span class="s1">&#39;avatar&#39;</span> <span class="o">=&gt;</span> <span class="p">[</span>
<span class="mi">0</span> <span class="o">=&gt;</span> <span class="c1">// UploadedFile instance,</span>
<span class="mi">1</span> <span class="o">=&gt;</span> <span class="c1">// UploadedFile instance,</span>
<span class="p">],</span>
<span class="p">],</span>
<span class="p">],</span>
<span class="p">]</span>
</pre></div>
</div>
</section>
<section id="single-file">
<h3><a class="toc-backref" href="#id12" role="doc-backlink">Single File</a><a class="headerlink" href="#single-file" title="Permalink to this heading"></a></h3>
<p>If you just need to access a single file, you can use <code class="docutils literal notranslate"><span class="pre">getFile()</span></code> to retrieve the file instance directly. This will return an instance of <code class="docutils literal notranslate"><span class="pre">CodeIgniter\HTTP\Files\UploadedFile</span></code>:</p>
<section id="simplest-usage">
<h4>Simplest usage<a class="headerlink" href="#simplest-usage" title="Permalink to this heading"></a></h4>
<p>With the simplest usage, a single file might be submitted like:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;file&quot;</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;userfile&quot;</span><span class="o">&gt;</span>
</pre></div>
</div>
<p>Which would return a simple file instance like:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="nv">$file</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">getFile</span><span class="p">(</span><span class="s1">&#39;userfile&#39;</span><span class="p">);</span>
</pre></div>
</div>
</section>
<section id="array-notation">
<h4>Array notation<a class="headerlink" href="#array-notation" title="Permalink to this heading"></a></h4>
<p>If you used an array notation for the name, the input would look something like:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;file&quot;</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;my-form[details][avatar]&quot;</span><span class="o">&gt;</span>
</pre></div>
</div>
<p>For get the file instance:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="nv">$file</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">getFile</span><span class="p">(</span><span class="s1">&#39;my-form.details.avatar&#39;</span><span class="p">);</span>
</pre></div>
</div>
</section>
</section>
<section id="multiple-files">
<h3><a class="toc-backref" href="#id13" role="doc-backlink">Multiple files</a><a class="headerlink" href="#multiple-files" title="Permalink to this heading"></a></h3>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;file&quot;</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;images[]&quot;</span> <span class="nx">multiple</span><span class="o">&gt;</span>
</pre></div>
</div>
<p>In controller:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$imagefile</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">getFiles</span><span class="p">())</span> <span class="p">{</span>
<span class="k">foreach</span> <span class="p">(</span><span class="nv">$imagefile</span><span class="p">[</span><span class="s1">&#39;images&#39;</span><span class="p">]</span> <span class="k">as</span> <span class="nv">$img</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$img</span><span class="o">-&gt;</span><span class="na">isValid</span><span class="p">()</span> <span class="o">&amp;&amp;</span> <span class="o">!</span> <span class="nv">$img</span><span class="o">-&gt;</span><span class="na">hasMoved</span><span class="p">())</span> <span class="p">{</span>
<span class="nv">$newName</span> <span class="o">=</span> <span class="nv">$img</span><span class="o">-&gt;</span><span class="na">getRandomName</span><span class="p">();</span>
<span class="nv">$img</span><span class="o">-&gt;</span><span class="na">move</span><span class="p">(</span><span class="nx">WRITEPATH</span> <span class="o">.</span> <span class="s1">&#39;uploads&#39;</span><span class="p">,</span> <span class="nv">$newName</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<p>where the <code class="docutils literal notranslate"><span class="pre">images</span></code> is a loop from the form field name.</p>
<p>If there are multiple files with the same name you can use <code class="docutils literal notranslate"><span class="pre">getFile()</span></code> to retrieve every file individually.</p>
<p>In controller:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="nv">$file1</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">getFile</span><span class="p">(</span><span class="s1">&#39;images.0&#39;</span><span class="p">);</span>
<span class="nv">$file2</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">getFile</span><span class="p">(</span><span class="s1">&#39;images.1&#39;</span><span class="p">);</span>
</pre></div>
</div>
<p>You might find it easier to use <code class="docutils literal notranslate"><span class="pre">getFileMultiple()</span></code>, to get an array of uploaded files with the same name:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="nv">$files</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">getFileMultiple</span><span class="p">(</span><span class="s1">&#39;images&#39;</span><span class="p">);</span>
</pre></div>
</div>
<p>Another example:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="nx">Upload</span> <span class="nx">an</span> <span class="nx">avatar</span><span class="o">:</span> <span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;file&quot;</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;my-form[details][avatars][]&quot;</span><span class="o">&gt;</span>
<span class="nx">Upload</span> <span class="nx">an</span> <span class="nx">avatar</span><span class="o">:</span> <span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;file&quot;</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;my-form[details][avatars][]&quot;</span><span class="o">&gt;</span>
</pre></div>
</div>
<p>In controller:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="nv">$file1</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">getFile</span><span class="p">(</span><span class="s1">&#39;my-form.details.avatars.0&#39;</span><span class="p">);</span>
<span class="nv">$file2</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">getFile</span><span class="p">(</span><span class="s1">&#39;my-form.details.avatars.1&#39;</span><span class="p">);</span>
</pre></div>
</div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Using <code class="docutils literal notranslate"><span class="pre">getFiles()</span></code> is more appropriate.</p>
</div>
</section>
</section>
<section id="working-with-the-file">
<h2><a class="toc-backref" href="#id14" role="doc-backlink">Working with the File</a><a class="headerlink" href="#working-with-the-file" title="Permalink to this heading"></a></h2>
<p>Once youve retrieved the UploadedFile instance, you can get information about the file in safe ways, as well as
move the file to a new location.</p>
<section id="verify-a-file">
<span id="id2"></span><h3><a class="toc-backref" href="#id15" role="doc-backlink">Verify a File</a><a class="headerlink" href="#verify-a-file" title="Permalink to this heading"></a></h3>
<p>You can check that a file was actually uploaded via HTTP with no errors by calling the <code class="docutils literal notranslate"><span class="pre">isValid()</span></code> method:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span> <span class="nv">$file</span><span class="o">-&gt;</span><span class="na">isValid</span><span class="p">())</span> <span class="p">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nx">\RuntimeException</span><span class="p">(</span><span class="nv">$file</span><span class="o">-&gt;</span><span class="na">getErrorString</span><span class="p">()</span> <span class="o">.</span> <span class="s1">&#39;(&#39;</span> <span class="o">.</span> <span class="nv">$file</span><span class="o">-&gt;</span><span class="na">getError</span><span class="p">()</span> <span class="o">.</span> <span class="s1">&#39;)&#39;</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
<p>As seen in this example, if a file had an upload error, you can retrieve the error code (an integer) and the error
message with the <code class="docutils literal notranslate"><span class="pre">getError()</span></code> and <code class="docutils literal notranslate"><span class="pre">getErrorString()</span></code> methods. The following errors can be discovered through
this method:</p>
<ul class="simple">
<li><p>The file exceeds your <code class="docutils literal notranslate"><span class="pre">upload_max_filesize</span></code> ini directive.</p></li>
<li><p>The file exceeds the upload limit defined in your form.</p></li>
<li><p>The file was only partially uploaded.</p></li>
<li><p>No file was uploaded.</p></li>
<li><p>The file could not be written on disk.</p></li>
<li><p>File could not be uploaded: missing temporary directory.</p></li>
<li><p>File upload was stopped by a PHP extension.</p></li>
</ul>
</section>
<section id="file-names">
<h3><a class="toc-backref" href="#id16" role="doc-backlink">File Names</a><a class="headerlink" href="#file-names" title="Permalink to this heading"></a></h3>
<section id="getname">
<h4>getName()<a class="headerlink" href="#getname" title="Permalink to this heading"></a></h4>
<p>You can retrieve the original filename provided by the client with the <code class="docutils literal notranslate"><span class="pre">getName()</span></code> method. This will typically be the
filename sent by the client, and should not be trusted. If the file has been moved, this will return the final name of
the moved file:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="nv">$name</span> <span class="o">=</span> <span class="nv">$file</span><span class="o">-&gt;</span><span class="na">getName</span><span class="p">();</span>
</pre></div>
</div>
</section>
<section id="getclientname">
<h4>getClientName()<a class="headerlink" href="#getclientname" title="Permalink to this heading"></a></h4>
<p>Always returns the original name of the uploaded file as sent by the client, even if the file has been moved:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="nv">$originalName</span> <span class="o">=</span> <span class="nv">$file</span><span class="o">-&gt;</span><span class="na">getClientName</span><span class="p">();</span>
</pre></div>
</div>
</section>
<section id="gettempname">
<h4>getTempName()<a class="headerlink" href="#gettempname" title="Permalink to this heading"></a></h4>
<p>To get the full path of the temp file that was created during the upload, you can use the <code class="docutils literal notranslate"><span class="pre">getTempName()</span></code> method:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="nv">$tempfile</span> <span class="o">=</span> <span class="nv">$file</span><span class="o">-&gt;</span><span class="na">getTempName</span><span class="p">();</span>
</pre></div>
</div>
</section>
</section>
<section id="other-file-info">
<h3><a class="toc-backref" href="#id17" role="doc-backlink">Other File Info</a><a class="headerlink" href="#other-file-info" title="Permalink to this heading"></a></h3>
<section id="getclientextension">
<h4>getClientExtension()<a class="headerlink" href="#getclientextension" title="Permalink to this heading"></a></h4>
<p>Returns the original file extension, based on the file name that was uploaded:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="nv">$ext</span> <span class="o">=</span> <span class="nv">$file</span><span class="o">-&gt;</span><span class="na">getClientExtension</span><span class="p">();</span>
</pre></div>
</div>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>This is NOT a trusted source. For a trusted version, use <code class="docutils literal notranslate"><span class="pre">guessExtension()</span></code> instead.</p>
</div>
</section>
<section id="getclientmimetype">
<h4>getClientMimeType()<a class="headerlink" href="#getclientmimetype" title="Permalink to this heading"></a></h4>
<p>Returns the mime type of the file as provided by the client. This is NOT a trusted value. For a trusted
version, use <code class="docutils literal notranslate"><span class="pre">getMimeType()</span></code> instead:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="nv">$type</span> <span class="o">=</span> <span class="nv">$file</span><span class="o">-&gt;</span><span class="na">getClientMimeType</span><span class="p">();</span>
<span class="k">echo</span> <span class="nv">$type</span><span class="p">;</span> <span class="c1">// image/png</span>
</pre></div>
</div>
</section>
<section id="getclientpath">
<h4>getClientPath()<a class="headerlink" href="#getclientpath" title="Permalink to this heading"></a></h4>
<div class="versionadded">
<p><span class="versionmodified added">New in version 4.4.0.</span></p>
</div>
<p>Returns the <a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/API/File/webkitRelativePath">webkit relative path</a> of the uploaded file when the client has uploaded files via directory upload.
In PHP versions below 8.1, this returns <code class="docutils literal notranslate"><span class="pre">null</span></code></p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="nv">$clientPath</span> <span class="o">=</span> <span class="nv">$file</span><span class="o">-&gt;</span><span class="na">getClientPath</span><span class="p">();</span>
<span class="k">echo</span> <span class="nv">$clientPath</span><span class="p">;</span> <span class="c1">// dir/file.txt, or dir/sub_dir/file.txt</span>
</pre></div>
</div>
</section>
</section>
<section id="moving-files">
<h3><a class="toc-backref" href="#id18" role="doc-backlink">Moving Files</a><a class="headerlink" href="#moving-files" title="Permalink to this heading"></a></h3>
<section id="with-original-filename">
<h4>with Original Filename<a class="headerlink" href="#with-original-filename" title="Permalink to this heading"></a></h4>
<p>Each file can be moved to its new location with the aptly named <code class="docutils literal notranslate"><span class="pre">move()</span></code> method. This takes the directory to move
the file to as the first parameter:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="nv">$file</span><span class="o">-&gt;</span><span class="na">move</span><span class="p">(</span><span class="nx">WRITEPATH</span> <span class="o">.</span> <span class="s1">&#39;uploads&#39;</span><span class="p">);</span>
</pre></div>
</div>
<p>By default, the original filename was used.</p>
</section>
<section id="with-new-filename">
<h4>with New Filename<a class="headerlink" href="#with-new-filename" title="Permalink to this heading"></a></h4>
<p>You can specify a new filename by passing it as the second parameter:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="nv">$newName</span> <span class="o">=</span> <span class="nv">$file</span><span class="o">-&gt;</span><span class="na">getRandomName</span><span class="p">();</span>
<span class="nv">$file</span><span class="o">-&gt;</span><span class="na">move</span><span class="p">(</span><span class="nx">WRITEPATH</span> <span class="o">.</span> <span class="s1">&#39;uploads&#39;</span><span class="p">,</span> <span class="nv">$newName</span><span class="p">);</span>
</pre></div>
</div>
</section>
<section id="overwriting-existing-file">
<h4>Overwriting Existing File<a class="headerlink" href="#overwriting-existing-file" title="Permalink to this heading"></a></h4>
<p>By default, if the destination file already exists, a new filename will be used.
For example, if <strong>image_name.jpg</strong> already exists in the directory, then the
filename will be <strong>image_name_1.jpg</strong> automatically.</p>
<p>You can overwrite the existing file by passing <code class="docutils literal notranslate"><span class="pre">true</span></code>
as the third parameter:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="nv">$file</span><span class="o">-&gt;</span><span class="na">move</span><span class="p">(</span><span class="nx">WRITEPATH</span> <span class="o">.</span> <span class="s1">&#39;uploads&#39;</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="k">true</span><span class="p">);</span>
</pre></div>
</div>
</section>
<section id="check-if-the-file-moved">
<h4>Check if the File Moved<a class="headerlink" href="#check-if-the-file-moved" title="Permalink to this heading"></a></h4>
<p>Once the file has been moved the temporary file is deleted. You can check if a file has been moved already with
the <code class="docutils literal notranslate"><span class="pre">hasMoved()</span></code> method, which returns a boolean:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$file</span><span class="o">-&gt;</span><span class="na">isValid</span><span class="p">()</span> <span class="o">&amp;&amp;</span> <span class="o">!</span> <span class="nv">$file</span><span class="o">-&gt;</span><span class="na">hasMoved</span><span class="p">())</span> <span class="p">{</span>
<span class="nv">$file</span><span class="o">-&gt;</span><span class="na">move</span><span class="p">(</span><span class="nv">$path</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
</section>
<section id="when-moving-fails">
<h4>When Moving Fails<a class="headerlink" href="#when-moving-fails" title="Permalink to this heading"></a></h4>
<p>Moving an uploaded file can fail, with an <code class="docutils literal notranslate"><span class="pre">HTTPException</span></code>, under several circumstances:</p>
<ul class="simple">
<li><p>the file has already been moved</p></li>
<li><p>the file did not upload successfully</p></li>
<li><p>the file move operation fails (e.g., improper permissions)</p></li>
</ul>
</section>
</section>
<section id="store-files">
<h3><a class="toc-backref" href="#id19" role="doc-backlink">Store Files</a><a class="headerlink" href="#store-files" title="Permalink to this heading"></a></h3>
<p>Each file can be moved to its new location with the aptly named <code class="docutils literal notranslate"><span class="pre">store()</span></code> method.</p>
<p>With the simplest usage, a single file might be submitted like:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;file&quot;</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;userfile&quot;</span><span class="o">&gt;</span>
</pre></div>
</div>
<p>By default, upload files are saved in <strong>writable/uploads</strong> directory. The <strong>YYYYMMDD</strong> folder
and random file name will be created. Returns a file path:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="nv">$path</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">getFile</span><span class="p">(</span><span class="s1">&#39;userfile&#39;</span><span class="p">)</span><span class="o">-&gt;</span><span class="na">store</span><span class="p">();</span>
</pre></div>
</div>
<p>You can specify a directory to move the file to as the first parameter. A new filename by
passing it as the second parameter:</p>
<div class="highlight-html+php notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;?</span><span class="nx">php</span>
<span class="nv">$path</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">request</span><span class="o">-&gt;</span><span class="na">getFile</span><span class="p">(</span><span class="s1">&#39;userfile&#39;</span><span class="p">)</span><span class="o">-&gt;</span><span class="na">store</span><span class="p">(</span><span class="s1">&#39;head_img/&#39;</span><span class="p">,</span> <span class="s1">&#39;user_name.jpg&#39;</span><span class="p">);</span>
</pre></div>
</div>
<p>Moving an uploaded file can fail, with an <code class="docutils literal notranslate"><span class="pre">HTTPException</span></code>, under several circumstances:</p>
<ul class="simple">
<li><p>the file has already been moved</p></li>
<li><p>the file did not upload successfully</p></li>
<li><p>the file move operation fails (e.g., improper permissions)</p></li>
</ul>
</section>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="typography.html" class="btn btn-neutral float-left" title="Typography" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="uri.html" class="btn btn-neutral float-right" title="Working with URIs" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2019-2025 CodeIgniter Foundation.
<span class="lastupdated">Last updated on Feb 07, 2025.
</span></p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(false);
});
</script>
</body>
</html>