Illegal string offset 'tmp_name'

Par LeDevDu50, il y a 10 ans


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

Blinkers, il y a 10 ans

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.

LeDevDu50, il y a 10 ans

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.

Blinkers, il y a 10 ans

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');
PhiSyX, il y a 10 ans

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