Je débogue cet ajax depuis un bon moment maintenant. J'ai ceci sur mon fichier jQuery:
$("#typeForm").ajaxForm({
success : function(html){
alert(html);
}).submit();
Cela appelle service.php , et dans celui-ci, j'ai ceci:
$data = array('upload_data' => $this->upload->data());
$str = "<div style='position:relative'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>";
echo json_encode(array('file_name' => $data['upload_data']['file_name'], 'Prompt' => $str));
Cela ne marchera pas. Mais en remplaçant $str
par $str = "HELLO WORLD";
les alertes jQuery, à quoi devrais-je m'attendre? Quel semble être le problème?
MODIFIER:
Voici un screenie de la sortie:
Il fait des alertes, mais si je modifie mon jQuery dans ceci:
$("#typeForm").ajaxForm({
success : function(html){
var obj = $.parseJSON(html);
alert(obj);
}).submit();
Ensuite, il ne fait rien du tout, même en alerte.
J'ai fait un var_dump sur le json_encode
et voici le dump, il ressemble à un JSON mal formé:
string(214) "{"file_name":"cde595988d386529909ce5a8fe3a6d6f.png","Prompt":"<div style="position:relative;"><img src="\/assets\/ui\/success.png" \=""><span style="position:relative;top:-15px;">Nachricht empfangen!<\/span><\/div>"}"
</span></div>
Voici le contenu complet de service.php
class Service extends CI_Controller
{
public function __construct()
{
parent::__construct();
}
public function index()
{
$filename = 'uploadfile';
$config['upload_path'] = './uploads/temp';
$config['allowed_types'] = 'jpg|png|gif|doc|docx|pdf|ppt|pptx|xls|xlsx|bmp';
$config['max_size'] = '3072';
$config['encrypt_name'] = TRUE;
$config['remove_spaces'] = TRUE;
$this->load->library('upload', $config);
if (!$this->upload->do_upload($filename))
{
$error = array('error' => $this->upload->display_errors());
echo json_encode(array('error' => $error['error']));
}
else
{
$data = array('upload_data' => $this->upload->data());
$file_name = $data['upload_data']['file_name'];
//print_r($data);
//echo json_encode(array('test' => "Hello World"));
$str = "<div style='position:relative;'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>";
$str2 = json_encode(array("file_name" => $file_name, "Prompt" => $str));
//var_dump($str2);
exit(json_encode(array('file_name' => $data['upload_data']['file_name'], 'Prompt' => $str)));
}
}
}
J'avais le même problème avec json_encode
aujourd'hui. Mais après avoir beaucoup testé, j'ai trouvé la bonne solution:
Dans PHP pour encoder le tableau ou la chaîne:
json_encode($array, JSON_HEX_QUOT | JSON_HEX_TAG);
En JS pour décoder le même:
var d = $.parseJSON(content);
Quelques trucs à essayer:
ajaxForm supporte l'argument dataType, si vous attendez un JSON provenant du serveur, utilisez dataType: json
comme suit
$("#typeForm").ajaxForm({
success : function(html){
// html here is already automatically a json object
alert(html.Prompt);
},
dataType: 'json'
}).submit();
Pourriez-vous publier le service complet.php? OR essayez ce qui suit:
exit (json_encode (array ('nom_fichier' => $ data ['upload_data'] [nom_fichier ']],' Prompt '=> $ str)));
-- MODIFIER --
Vous ne savez pas pourquoi json_encode renvoie une chaîne aussi étrange: s, le json_encode
est-il une bibliothèque php standard ou une bibliothèque externe? Je demande ceci parce que certains serveurs n'ont pas json_encode dans leur installation php ... J'ai testé sur mon local et en utilisant php interne json_encode et cela fonctionne très bien:
<?php
$str = "<div style='position:relative'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>";
echo json_encode(array('Prompt' => $str));
// output
//{"Prompt":"<div style='position:relative'><img src='\/assets\/ui\/success.png' \/><span style='position:relative;top:-15px;'>Nachricht empfangen!<\/span><\/div>"}
Si vous ne trouvez pas de meilleure solution pour cela, vous pouvez encoder la valeur en encodage base64:
$data = array('upload_data' => $this->upload->data());
$str = base64_encode("<div style='position:relative'><img src='/assets/ui/success.png' /><span style='position:relative;top:-15px;'>Nachricht empfangen!</span></div>");
echo json_encode(array('file_name' => $data['upload_data']['file_name'], 'Prompt' => $str));
et dans le client le décoder, IMO c'est plus sûr c'est aussi plus applicable si vous traitez des caractères de différentes langues.
ÉGALEMENT:
pour être sûr qu'aucun autre caractère ne sera ajouté à l'appel de chaîne json exit; écrivain après l’avoir imprimé.
string(214) "{"file_name":"cde595988d386529909ce5a8fe3a6d6f.png","Prompt":"<div style="position:relative;"><img src="\/assets\/ui\/success.png" \=""><span style="position:relative;top:-15px;">Nachricht empfangen!<\/span><\/div>"}"
</span></div>
Cela semble être cassé parce qu'aucune citation ne s'échappe. Quand un "non échappé" est trouvé, la structure JSON que vous attendez est cassée. ".
Que diriez-vous de convertir tous les caractères problématiques potentiels au lieu de ce qui résout le problème dans ces circonstances:
die(json_encode($data, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE));
Il semble que vous ayez besoin d'échapper à vos citations côté serveur. Comme ils sont là, il semble créer une chaîne JSON non valide.