This document contains information about a future release and not the current stable version (4). Be aware that information on this page may change and API's may not be stable for production use.

Import CSV Data through a Controller

You can have more customised logic and interface feedback through a custom controller. Let's create a simple upload form (which is used for MyDataObject instances). You can access it through


class MyController extends Controller {

    private static $allowed_actions = array(

    protected $template = "BlankPage";

    public function Link($action = null) {
        return Controller::join_links('MyController', $action);

    public function Form() {
        $form = new Form(
            new FieldList(
                new FileField('CsvFile', false)
            new FieldList(
                new FormAction('doUpload', 'Upload')
            new RequiredFields()
        return $form;

    public function doUpload($data, $form) {
        $loader = new CsvBulkLoader('MyDataObject');
        $results = $loader->load($_FILES['CsvFile']['tmp_name']);
        $messages = array();

        if($results->CreatedCount()) {
            $messages[] = sprintf('Imported %d items', $results->CreatedCount());

        if($results->UpdatedCount()) {
            $messages[] = sprintf('Updated %d items', $results->UpdatedCount());

        if($results->DeletedCount()) {
            $messages[] = sprintf('Deleted %d items', $results->DeletedCount());

        if(!$messages) {
            $messages[] = 'No changes';

        $form->sessionMessage(implode(', ', $messages), 'good');

        return $this->redirectBack();

This interface is not secured, consider using Permission::check() to limit the controller to users with certain access rights.

Was this article helpful?