0

我有一个 ajax 应用程序。它基本上将图像上传到一个文件夹,然后 PHP 抓取它们并将它们放入一个数组中。从那里它被 json_encoded 并通过 echo 发送回来。alert(responseText)给我json版本。在我将一个变量设置为 后json.parse()console.log()它作为一个数组出来很好。该数组看起来基本上是这样的:

1 IMAGE1.jpg
2 IMAGE2.jpg
3 IMAGE3.jpg
4 IMAGE4.jpg
5 IMAGE5.jpg

等等

我知道它现在位于 javascript/json 对象中。不幸的是,我找不到有关操纵此对象以获取所有图像名称和最后一个数组类型的任何信息,这是上传的真正成功或失败。任何人都可以向我指出一些文档或一种方法来操纵它并将信息外推到一个数组中。最后,我试图动态显示这些图像,但我假设通过上传它们并不都具有相同的名称。

所以我希望抓取所有 .jpg/.png./gif 等文件并抓取这些文件名,然后使用循环innerHTML创建一堆具有正确文件名的标签。<img>同样,处理数组中的最后一部分,它只是说明上传是否完全成功的文本。

我不应该使用 JSON 吗?我的代码如下。

PHP

$dirhandler = opendir(UPLOAD_DIR);
//create handler to directory

//read all the files from directory
$nofiles=0;
while ($file = readdir($dirhandler)) {
    //if $file isn't this directory or its parent
    //echo "FILE SYSTEM: " . $file . "<br/>";
    //add to the $files array
    if ($file != '.' && $file != '..') {
        $nofiles++;
        $files[$nofiles]=$file;
    } //end of if loop
} //end of while loop
//json_encode($files);
if (!$success) { 
    $nofiles++;
    $files[$nofiles] = "Unable to upload file";
    exit;
} else {
    $nofiles++;
    $files[$nofiles] = "File Upload Successfully";
}
echo json_encode($files);

JAVASCRIPT

   if (xhr.readyState === 4 && xhr.status === 200) {
            progressBar.value="100";
            progressText = "Upload Complete!";
            progressStatus.innerHTML = progressText;
            var imageNames = JSON.parse(xhr.responseText);
            alert(imageNames);
        } else if (xhr.readyState === 0 || xhr.readyState === 1) {
            progressBar.value = "25";
            progressText = "Starting Upload..";
            progressStatus.innerHTML = progressText;
        } else if (xhr.readyState === 2) {
            progressBar.value = "50";
            progressText = "Almost Done...";
            progressStatus.innerHTML = progressText;
        } else if (xhr.readyState === 3) {
            progressBar.value = "75";
            progressText = "So Close!";
            progressStatus.innerHTML = progressText;
        } else if (xhr.status === 404 || xhr.status === 500) {
            alert("Your Upload Request failed.");
        }
4

1 回答 1

0

imageNames是一个没什么特别的对象——像使用任何普通的 javascript 对象一样使用它。例如:imageNames[2]会给你第二个图像名称。

json_encode()但是,如果您生成一个可以理解为实际 JS 数组的数组,您的生活将会轻松得多。在您的 PHP 中,为每个图像包含一个条目,而不是使用显式索引:

$files = array();
$entries = scandir(UPLOAD_DIR);
foreach ($entries as $entry) {
    if (is_file(UPLOAD_DIR.'/'.$entry)) {
        $files[] = $entry;
    }
}
if (!$files) {
    // signal an error with an actual HTTP error code!
    header('Content-Type: application/json', false, 500);
    echo json_encode(array('error'=>'upload failed'));
} else {
    header('Content-Type: application/json');
    echo json_encode($files);
}

但是,我怀疑您应该在处理文件时收集文件名。使用带有输入元素的上传表单,例如<input type="file" name="images[]">,然后使用以下内容上传到脚本:

function process_uploaded_files($files, $destdir, $nametmpl) {
    $moved = array();
    foreach ($files['error'] as $key => $error) {
        $newname = FALSE;
        if ($error===UPLOAD_ERR_OK) {
            $source = $files['tmp_name'][$key];
            $destname = sprintf($nametmpl, $key);
            $dest = "{$destdir}/{$destname}";
            if (move_uploaded_file($source, $dest)) {
                // success!
                $newname = $destname;
            }
        }
        $moved[$key] = $newname;
    }
    return $moved;
}

function filename_to_url($filename) {
    // or whatever
    return ($filename) ? '/images/'.$filename : $filename;
}    

$uploaded_files = process_uploaded_files($_FILES['images'], UPLOAD_DIR, 'Image%03d');

// you should always return URLs of resources (not bare filenames) to be RESTful
$new_urls = array_map('filename_to_url', $uploaded_files);
header('Content-Type: application/json');
echo json_encode($new_urls);
于 2013-01-15T18:23:16.133 回答