Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Dans UploadComponent je fais:

...

class UploadComponent extends Component
{

    public function send($data)
    {
        if(!empty($data)){
            foreach($data as $file){
                $filename = $this->request->data('name');
                $file_tmp_name = $file['tmp_name'];
                $dir = WWW_ROOT.'uploads';
                $allowed = ['rar', 'zip'];
                if(!in_array(substr(strrchr($filename, '.'), 1), $allowed)){
                    throw new InternalErrorException("Error Processing Request.", 1);
                }elseif(is_uploaded_file($file_tmp_name)){
                    move_uploaded_file($file_tmp_name, $dir.DS.Text::uuid().'-'.$filename);
                }
            }
        }
    }
}

puis j'appel le component Upload dans AppController puis dans TokensController je fais:

    public function add()
    {
        $token = $this->Tokens->newEntity();
        if ($this->request->is('post')) {
            $token = $this->Tokens->patchEntity($token, $this->request->data);
            $hash = hash('sha512', sha1(rand() . uniqid() . time()));
            $token->token = $hash;
            $this->Upload->send($this->request->data('kv'));
            if ($this->Tokens->save($token)) {
                $this->Flash->success(__('Le KV a été sauvegardé.'));
                return $this->redirect(['action' => 'index']);
            } else {
                $this->Flash->error(__('Erreur lors de l\'enregistrement.'));
            }
        }
        $this->set(compact('token'));
        $this->set('_serialize', ['token']);
    }

pour ajouter un kv. Et dans la vue je fais:

...
<?= $this->Form->create($token, ['enctype' => 'multipart/form-data']) ?>
            <?= $this->Form->input('name', ['placeholder' => 'Le nom du kv doit être unique. Par Exemple: KV_1']) ?>
            <!--<div class="file-inputs">-->
                <?= $this->Form->file('kv', ['multiple']); ?>
            <!--    <div class="fake-file-inputs" onclick="$('#InputFile').click();">
                    <p>Ajouter un kv</p>
                </div>
                <div id="Choice"></div>
            </div>-->
            <p style="margin-left: 45%;">Le fichier doit être en .rar ou .zip</p>
            <input type="submit" value="Ajouter le KV">
        <?= $this->Form->end() ?>
...

Ce que je veux

Je veux upload des fichiers rar et/ou zip.

Ce que j'obtiens

Alors j'obtiens une belle erreur:
L'erreur: Warning (2): Illegal string offset 'tmp_name' [APP/Controller/Component/UploadComponent.php, line 20]

Je vous remercie d'avance pour votre aide.

4 réponses


Hello,
Apparement tu a un problème avec la variable $file['tmp_name'];
Dans ta fonction send de ton UploadComponent , fait un debug de $file dans ton foreach.
debug($file); exit;

Tu devrais voir ce qui bug.

Bonsoir,
merci de ta réponse,
je te copie ce que cake me dit (car le debug me sort jsute l'archive envoyée).

$data = [
    'name' => '115675333443.rar',
    'type' => 'application/octet-stream',
    'tmp_name' => '/tmp/php6dGK7V',
    'error' => (int) 0,
    'size' => (int) 5537
]
$file = '115675333443.rar'
$filename = 'KV_1'

Merci d'avance.

Hello,

Oui alors déjà c'est normal, ta variable $file_tmp_name = $file['tmp_name']; n'existe pas.
Essaye de mettre à la place :

$file_tmp_name = $this->request->data('tmp_name');

Tu as mal nommé ton champ input 'kv' dans ta vue. Essaye avec 'kv[]' ;)