-
-
Save adityamenon/3214128 to your computer and use it in GitHub Desktop.
<?php if(!defined('BASEPATH')) exit("No direct script access allowed."); | |
class Upload_test extends CI_Controller { | |
public function index() { | |
if($this->input->post('submit')) { | |
$config['upload_path'] = BASEPATH.'../uploads'; | |
$config['allowed_types'] = 'txt'; | |
$this->load->library('upload', $config); | |
if(empty($_FILES) { | |
//redirect or do something else to stop execution | |
} | |
foreach ($_FILES as $key => $value) { //THIS IS THE CRUCIAL PART | |
$this->upload->do_upload($key); | |
var_dump($this->upload->data()); | |
var_dump($this->upload->display_errors()); | |
} | |
exit(); | |
} | |
$this->load->helper('form'); | |
$this->load->view('upload_test'); | |
} | |
//I have no idea why more complex code exists for the same thing elsewhere on the 'net! | |
} |
Thanks for your code input, you have discussed a more intricate form of OOP than the easy stuff I tend to do with CodeIgniter. I was trying to illustrate using CodeIgniter's native upload function in a multi-upload situation, but of course your input on how to handle uploads in general in an OOP context is most welcome.
@adityamenon yes, the fact is that it is problematic to have configuration in a controller.
The controller should just proxy calls to the service layer and translate responses from it (which kind of happens in your example, but is not really clean). It is more a question of doing things right.
That's just me being always critic to examples who show the "doing fast"... But I'm everything but pragmatic :)
Hi! Okay, yes, sorry about the configuration. Actually, CI provides a way to keep that configuration inside a separate file and even initialize the Upload class for use in separate locations (framework configuration files). I guess I should have just alluded to that but somehow felt keeping those lines in this examples make it more complete. In that case, the injection of the uploader happens automatically and nothing is needed to be done.
I am not familiar with Service Oriented Architecture, but in the case of CodeIgniter, do you mean it should just proxy calls to the Model? Yeah, that's a recommended best practice :) But how do I remove all references to $_FILES
though? I think by extending the Uploader and putting this logic into that, I am guessing...
Have you ever used CI?
I used CI some years ago, so I'm not updated at all about its functionality. I currently stick with ZF2/SF2.
Anyway, the uploader "adapter" (inspired by the old ZF1 file transfer adapter) could be aware of the environment since this is more like a PHP limitation (really feels weird to have files in a separate temporary location by default, but it is to avoid loading them into memory)...
Another way of solving it would be to pass $_FILES
like following:$this->uploader->receive($_FILES)
.
It still doesn't work without some assumptions though.
I used CI some years ago, so I'm not updated at all about its functionality.
Ah okay, that is why we are having slight difficulty aligning thoughts on this - this is more of a quick-solve post, because CI's upload library allows only single file uploads, and it's not clear from the documentation if any input field will work or only the ones created with the CI form helper (making me wonder if there was some sort of 'registration' of file fields required by the library). I wanted to show a simple way of looping the upload library to remove any confusion about it.
@adityamenon Aha, I came here from a reshare on G+, not because I'm interested in CI itself :)
I personally prefer following approach (since controllers shouldn't know anything of the environment). This is pseudo-code, but it is basically some SOA principles applied.
(yes, I love opening cans of worms :) )