CodeIgniter 4 : Upload File - php

I have a problem uploading a file in my form using CodeIgniter 4 and I can't find what's wrong. Can you help me, please? The name of the file is ok, the problem is that it doesn't move the file in the specified directory because I get this error: Call to a member function move() on null.
WRITEPATH has the value: C:\xampp\htdocs\myproject\writable\
The part of the view where I upload looks like this :
<div class="card-body">
<label for="exampleInputFile">Fisier</label>
<div class="form-group">
<div class="input-group">
<div class="custom-file">
<input type="file" class="custom-file-input" name="customFile" id="customFile" required>
<label class="custom-file-label" for="exampleInputFile">Alege Fisierul</label>
</div>
</div>
</div>
</div>
And the part of the controller function where I try to move the file in a specific folder looks like this :
$img = $this->request->getFile('customFile');
$img->move(WRITEPATH . 'uploads');
I take the name of the file with this : $this->request->getVar('customFile')
Thank you !

This worked in Codeigniter 4:
$file = $this->request->getFile('file');
if (!$file->isValid()) {
return $this->fail($file->getErrorString());
}
$file->move(ROOTPATH . 'public\uploads\documents');
$name = $file->getName();
Thank you!

In Controller Like this...
$config['upload_path'] = './upload/painting/';
$config['allowed_types'] = 'jpg|png|jpeg'; // here you want to define file type
$config['max_width'] = '250';
$config['max_height'] = '300';
$config['encrypt_name'] = TRUE;
$this->load->library('upload', $config);
// $this->upload->do_upload('profile_pic');
if ($this->upload->do_upload('ptn_url')) {
$data = array('upload_data' => $this->upload->data());
// print_r($data);
$_POST['ptn_url'] = "upload/painting/" . $data['upload_data']['file_name'];
$_POST['user_id'] = $this->session->user_data['user_id'];
in routes.php file which is located at config folder
you need to define path for store image
like this...
$route['upload-image'] = 'user';
$route['store-image'] = 'user/add';
$route['painting/(:num)'] = 'painting';
for More Reference about File Upload Visit CodeIgniter 3 File Upload
I hope this is helps to you...
Thank You...

Related

Codeigniter 3.0 , You did not select a file to upload

I have followed all the answers available on internet related to this topic, after 4 hours of searching and trying still no success..😣
Error thrown is
You did not select a file to upload.
EDIT
Tried using $_FILES method too.
I tried if($this->input->post('userfile')!==null)
to check whether image is being passed to controller or not and it turns out it doesn't as the if condition was not executed.
I have followed this guide to upload files on server.
https://www.codeigniter.com/user_guide/libraries/file_uploading.html?highlight=file%20upload
don't know what the issue is.
you can find the code in the above link.
my .htaccess file
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
EDIT:
I tried all the suggestions you guys provided.
Yeah it was my mistake to check the image via $_POST instead of $_FILES
But still the issue is same. I am posting the code I use and the URL which you can check too.
Any help would really be appreciated thankyou.
ImageUploadController.php
<?php
class ImageUploadController extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->helper(array('form', 'url'));
}
public function index()
{
$this->load->view('image-upload/upload_form', array('error' => ' ' ));
}
public function store($workType)
{
$config['upload_path'] = './assets/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = 100;
$config['max_width'] = 1024;
$config['max_height'] = 768;
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload('imageFile'))
{
if(isset($_FILES['imageFile']))
echo "isset";
$error = array('error' => $this->upload->display_errors());
$this->load->view('image-upload/upload_form', $error);
}
else
{
$data = array('upload_data' => $this->upload->data());
$this->load->view('image-upload/upload_success', $data);
}
}
}
?>
upload_form.php
https://gist.github.com/VickySalunkhe/1dc66ec6d3af8cf097a5c01b5009c804
upload_result.php
https://gist.github.com/VickySalunkhe/691626e4fe6dd8a8b3896d210e4b22b9
Route set for the request
$route['upload'] = 'ImageUploadController';
//stores the images on server
$route['store/(:any)'] = 'ImageUploadController/store/$1';
you can ignore the part for second route , its for some other logic part which will be implemented later on.
To upload a file in CodeIgniter 3 I recommend you use the File Uploading class.
You will find the link here: Uploading files in CodeIgniter
For what I see, is what you used above.
The documentation says you have to first load the upload library, with some configuration settings (see docs):
$this->load->library('upload', $config)
And then the method that does the actual upload (based on config params) is this:
$this->upload->do_upload('<your-file-name>');
Notice where it says, there you have to use the name of the file you are uploading via HTML. The file itself is not found on a POST array, but in the FILES array, everytime you are uploading a file using the HTML <input type="file"> element.
Try Blow Code
1) HTML:
<form action="/profile_upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="Submit">
</form>
2) PHP file:
if($_FILES['file']['name']!='') {
$config['upload_path'] = './uploads/admin/big';
$config['allowed_types'] = 'gif|jpg|png|jpeg';
$config['max_size'] = '10240';
$config['encrypt_name'] = TRUE;
$this->load->library('upload', $config);
if (!$this->upload->do_upload('file')) {
// ERROR
$error = array('error' => $this->upload->display_errors());
}
else {
// SUCCESS
$file_name = $this->upload->file_name;
}
}
Check form enctype attribute e.g
check $_FILES variable empty or not.
View:
<?php echo form_open_multipart('updateFunctionName');?>
<div class="col-md-6">
<div class="form-group">
<label for="artworkpath">Artwork</label>
<input type="file" class="form-control" id="artworkpath" name="artworkpath" value="<?php echo $artworkpath; ?>">
</div>
</div>
</form>
Controller:
function updateFunctionName(){
$artworkpath = $this->input->post('artworkpath');
$CheckFileName = true;
if ($_FILES['artworkpath']['size'] == 0 && $_FILES['artworkpath']['error'] == 0)
{
$CheckFileName = false;
}
else
{
$filename2 = 'Artwork_'.rand(0,999999);
if( ! is_dir('uploads') ){mkdir('uploads',0777,TRUE); };
$path='uploads/';
$imgtmpname=$_FILES['artworkpath']['tmp_name'];
$name = $_FILES["artworkpath"]["name"];
$ext = end((explode(".", $name)));
$fullpath= $path .$filename2.'.'.$ext;
$filename = $filename2;
move_uploaded_file($imgtmpname,$fullpath);
}
In DB save this variable data in column:
$Info = array();
if ($ext <> '')
{
$Info = array('artworkpath'=>$fullpath, //other fields);
}
else
{
$Info = array(//other fields);
}
$this->user_model->updateRecord($Info, $Id);
}
Model:
function updateRecord($Info, $Id)
{
$this->db->where('Id', $Id);
$this->db->update('tablename', $Info);
}

codeigniter do_upload not working

I'm trying to add a file upload function in my website using codeigniter's upload library.
here's my view file (display.php):
<html>
<body>
<form method="post" action="" enctype="multipart/form-data">
<input type="file" name="filename" />
<input type="submit" name="submit" id="submit" value="submit"/>
</form>
</body>
</html>
and here's the controller:
public function testupload()
{
if ( ! empty($_FILES))
{
echo 'start upload';
$config['upload_path'] = './assets/img/tempfile/';
$this->load->library('upload');
$this->upload->initialize($config);
if ( ! $this->upload->do_upload('filename'))
{
echo 'error!';
}
else
{
echo 'success!';
}
echo 'end upload';
}
$this->load->view('display', $this->data);
}
but the code seems to stop after $this->upload->initialize($config); the file was not uploaded, and there was no message at all. only the 'start upload' message appeared; the echo 'success' , echo 'error' , and echo 'end upload' do not appear.
why is that? can anyone help me??
Late from party, but maybe this can help somebody with same problem. Please try this:
Views:
<?php echo form_open_multipart('test/upload');?>
<input type="file" name="photo">
<?php echo form_close();?>
Controller:
class Test extends CI_Controller {
function upload() {
$config = array(
'upload_path' => './assets/upload/',
'allowed_types'=> 'gif|jpg|png',
'encrypt_name' => TRUE // Optional, you can add more options as need
);
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload('photo')) {
echo '<pre>';
print_r($this->upload->display_errors());
exit();
} else {
echo '<pre>';
print_r($this->upload->data());
exit();
}
}
}
Inside views i recomended use this function form_open_multipart('ctrl/method') but if you prefer using HTML5 forms, just be sure correct the attributes in form like this.
<form action="<?=site_url('ctrl/method')?>" enctype="multipart/form-data" method="post" accept-charset="utf-8">
<input type="file" name="photo">
</form>
More preferences in $config['..'] can you find in documentation CodeIgniter https://codeigniter.com/user_guide/libraries/file_uploading.html
Try like this....
public function testupload()
{
if ( ! empty($_FILES))
{
echo 'start upload';
$config['upload_path'] = './assets/img/tempfile/';
$this->load->library('upload',$config);
if ( ! $this->upload->do_upload('filename'))
{
$error = array('error' => $this->upload->display_errors());
$this->load->view('display', $error); //loads the view display.php with error
}
else
{
echo 'success!';
}
echo 'end upload';
$data = array('upload_data' => $this->upload->data());
$this->load->view('display', $data); //loads view display.php with data
}
}
change from
$config['upload_path'] = './assets/img/tempfile/';
to
$config['upload_path'] = 'assets/img/tempfile/';
i check this code this work perfect
simply add this line
$config['allowed_types'] = 'png|gif|jpg|jpeg';
$config['max_size'] = '7000';
after this
$config['upload_path'] = './assets/img/tempfile/';
or you can also set this in view page
action="<?php echo base_url('YourController/testupload');?>"
this is due to php server version and it's option.
1).go to cpanel account
2).click "select php version", in the software section.
3).tap the "fileinfo" chexbox in the php option and save.
now you can upload file perfectly.
Same issue as described. I have fixed it using the following: Open the file system/libraries/Upload.php go to function validate_upload_path() and add the command return TRUE; as a last line inside this function. Save and try again.
use this for image upload:
$valid_extensions = array('jpeg', 'jpg', 'png');
if ($_FILES['filename']['error'] == 0) {
$img = $_FILES['filename']['name'];
$tmp = $_FILES['filename']['tmp_name'];
$ext = strtolower(pathinfo($img, PATHINFO_EXTENSION));
if (in_array($ext, $valid_extensions)) {
$path = "./assets/img/tempfile/" . strtolower($img);
if (move_uploaded_file($tmp, $path)) {
$_POST['filename'] = $path;
}
}
}
use insert query to insert file :
$this->db->insert('table_name', $_POST);
Having the same problem on macOS. It seems that if you are not the "main" user of your laptop/pc, the default permission is "Read Only". You must change it to "Read & Write".
Right click on the folder
Get Info
Sharing and permissions
Change 'Read Only' to 'Read & Write'
add allowed file type parameter in config
$config['allowed_types'] = 'gif|jpg|png';
your code is missing the following,
$this->load->library('upload',$config);
Recorrect it by rewriting the above code.

Update picture/image in Codeigniter

I'm trying to create update image for user who want to change their photo.The when i click submit on photo upload, there is no photo uploaded and photo's column still no update.
Here is my Contorller:
function foto($id='')
{
$data['data'] = $this->user_model->get_foto($id);
$data['form_action'] = site_url("user/update_foto/$id");
$this->load->view('user/foto_form', $data);
}
function update_foto($id=''){
$this->user_model->update_foto($id);
}
Here is My model:
function get_foto($id=0){
$id = $this->session->userdata('id');
$sql = "SELECT id,foto FROM user WHERE id= '$id'";
$query = $this->db->query($sql);
$data = $query->row_array();
return $data;
}
function update_foto(){
$config['upload_path'] = './upload/';
$config['allowed_types'] = 'jpg|png|jpeg';
$this->load->library('upload', $config);
if (!$this->upload->do_upload('foto'))
{
$id_user=$this->session->userdata('id');
redirect ("user/foto/$id_user");
} else {
$id_user=$this->session->userdata('id');
$data=array(
'foto'=>$this->input->post('foto')
);
$this->db->where('id',$id_user);
$this->db->update('user',$data);
redirect("user");
}
}
And this is my upload form on view:
<form role="form" action="<?php echo $form_action ?>" class="form-horizontal style-form" method="POST" enctype="multipart/form-data">
<label >Upload Foto</label>
<input type="file" name="foto"/>
<button type="submit">Save</button>
</form>
Any Answer? Many thanks for the answer...
On your controller try replacing this
from
site_url("user/update_foto/$id");
to
site_url("user/update_foto") ./. $id;
Or you could use uri segment refer user guide.
site_url("user/update_foto") ./. $this->uri->segment(4); // unsure id check uri segment in url.
Your route may need to be changed
$route['user/update_foto/(:any)'] = "controllername/foto/$1";
All ways make sure the controller has index()
At your model this is wrong.
$data=array(
'foto'=>$this->input->post('foto')
);
$this->input->post('foto') does not get your file name.
You can try that with this
else {
$id_user=$this->session->userdata('id');
$info=$this->upload->data();
$data=array(
'foto'=>$info['file_name']
);
$this->db->where('id',$id_user);
$this->db->update('user',$data);
redirect("user");
}
better use this line for your upload path
$config['upload_path'] = FCPATH.'upload/';
$file_name = "";
if ($_FILES['foto']['error']!= 4) {
$fileParts = pathinfo($_FILES['foto']['name']);
$file_name = time() . '.' . $fileParts['extension'];
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png|jpeg';
$config['file_name'] = $file_name;
$this->load->library('upload', $config);
$this->upload->initialize($config);
$this->upload->do_upload('foto');
}

how to submit file using jquery to codeigniter controller

May I ask for your help guys!
I am trying to upload a file and passing all the data to codeigniter controller using jquery.
my view file:
<div class="form-group">
<label class="col-md-4 control-label">Item Image</label>
<div class="col-md-8">
<input class="form-control" type="file" placeholder="" id="itemImage" name="itemImage" data-parsley-required="true" />
</div>
</div>
<button type="button" onclick="add_item();">Sumit</button>
<script>
function add_item(){
$.post('<?php echo site_url('admin_newitem/add_item'); ?>',
{
itemId : $('#itemId').val(),
itemImage : $('#itemImage').val()
},
function(data){
if(data.result=='SUCCESS'){
$('#itemId').val('');
$('#itemImage').val('');
//show success
}else{
//show error
}
},'json'
);
}
</script>
My controller:
function add_item(){
$this->output->set_status_header(200);
$this->output->set_header('Content-Type: application/json');
$itemId = $this->input->post('itemId');
$itemImage = $this->input->post('itemImage');;
$config['upload_path'] = realpath(APPPATH.'../assets_main/img/item/');
$config['allowed_types'] = 'jpg|jpeg';
$config['max_size'] = '100';
$config['max_width'] = '200';
$config['max_height'] = '200';
$file_name = $config['file_name'] = md5(uniqid(mt_rand()));
$config['remove_spaces'] = TRUE;
$this->load->library('upload', $config);
if(!$itemImage){
$jdata['result'] = "FAILED";
$jdata['message'] = "upload error.";
$jdata['field'] = "itemImage";
echo json_encode($jdata);
exit();
}
$data = array('upload_data' => $this->upload->data());
$jdata['message'] = "Thank you for purchasing our item!";
$jdata['result'] = "SUCCESS";
echo json_encode($jdata);
exit();
}
I was able to get the ItemId, and ItemImage but when I check the folder where the image is suppose to be located, it's not there. I think I fail to capture the real file, so, is there a way for me to get this done?
As you suggest, I believe that you are forgetting to actually do the upload, the code igniter documentation might help:
http://www.codeigniter.com/user_guide/libraries/file_uploading.html
With this correctly implemented, I think your code should look something similar to:
function add_item(){
$this->output->set_status_header(200);
$this->output->set_header('Content-Type: application/json');
$itemId = $this->input->post('itemId');
$itemImage = $this->input->post('itemImage');;
$config['upload_path'] = realpath(APPPATH.'../assets_main/img/item/');
$config['allowed_types'] = 'jpg|jpeg';
$config['max_size'] = '100';
$config['max_width'] = '200';
$config['max_height'] = '200';
$file_name = $config['file_name'] = md5(uniqid(mt_rand()));
$config['remove_spaces'] = TRUE;
$this->load->library('upload', $config);
//THE MISSING LINE
if($this->upload->do_upload()){
//THE FILE HAS NOW BEEN UPLOADED
$data = array('upload_data' => $this->upload->data());
$jdata['message'] = "Thank you for purchasing our item!";
$jdata['result'] = "SUCCESS";
echo json_encode($jdata);
exit();
}else{
//NO FILE UPLOADED
$jdata['result'] = "FAILED";
$jdata['message'] = "upload error.";
$jdata['field'] = "itemImage";
echo json_encode($jdata);
exit();
}
}
My initial thinking, having used CI and tried to do this same thing, is that you can't do file uploads via AJAX without a special plugin such as this:
http://malsup.com/jquery/form/
Specifically, this file upload portion:
http://malsup.com/jquery/form/#file-upload
Simply trying to send a post with the val of a file input will not work, I don't believe - though maybe more modern browsers are able to handle that now.

CI's upload class isnt working?

Of course by that I mean I'm doing something wrong with it. I posted a question before similar to this one and got some answers. Well based on those answers (I wasn't using CI's class now I am) I'm having a new problem. Any help would be appreciated.
PHP
public function do_upload () {
$scopeId = $this->input->get('id');
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|pdf';
$config['max_size'] = '1000';
$config['max_width'] = '1024';
$config['max_height'] = '768';
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload()) {
$error = array('error' => $this->upload->display_errors());
echo 'error'; <----- This is what is showing up
// uploading failed. $error will holds the errors.
} else {
$data = array('upload_data' => $this->upload->data());
// uploading successfull, now do your further actions
redirect(site_url('discovery/scopeDetails?scID='.$scopeId.''));
}
echo $error;
}
HTML Form
<div id="upload">
<?=form_open_multipart('discovery/do_upload');?>
<input name="userfile" size="40" type="file" />
<input type="submit" value="Upload" />
</div>
With the form i usually would just use straight HTML but I tried doing EXACTLY what http://codeigniter.com/user_guide/libraries/file_uploading.html told me to do.
Most likely the problem is your upload folder. Make sure it exists and set it's permissions to 777.
If that's not the problem then use print_r($error) to see what's wrong.
I had never experienced anything like that. My friend suggested to replace upload.php a new library with the old. so try it:
folder path "system/libraries/".
download and replace the file "upload.php"
http://www.4shared.com/file/BZci40l8/Upload.html
good luck! :D

Categories