This document contains information for an outdated version and may not be maintained any more. If some of your projects still use this version, consider upgrading as soon as possible.

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?