【发布时间】:2015-01-09 02:23:15
【问题描述】:
所有, 我正在使用 HTML5 上传器上传一些图片。这是将数据发送到我的 PHP 处理脚本的文件的一部分:
var ajax = $.ajax({
url: ajaxurl,
//dataType: options.ajaxDataType || 'json',
type: options.ajaxType || 'POST',
cache: false,
data: { name: $file.data('filename'), filename: $file.data('file'), file: evt.target.result, data: options.data, action: 'test_upload' },
headers: options.ajaxHeaders,
来自上传者,他们使用以下代码处理文件上传:
if (!empty($_POST)) {
$error = false;
$absolutedir = dirname(__FILE__);
$dir = '/tmp/';
$serverdir = $absolutedir.$dir;
$tmp = explode(',',$_POST['file']);
$file = base64_decode($tmp[1]);
$extension = strtolower(end(explode('.',$_POST['filename'])));
$filename = $_POST['name'].'.'.$extension;
//$filename = $file.'.'.substr(sha1(time()),0,6).'.'.$extension;
$handle = fopen($serverdir.$filename,'w');
fwrite($handle, $file);
fclose($handle);
$response = array(
"result" => true,
"url" => $dir.$filename.'?'.time(), //added the time to force update when editting multiple times
"filename" => $filename
);
echo json_encode($response);
//echo json_encode(array('result'=>true));
}
但是,我希望 Wordpress 处理我的文件上传,所以我尝试使用以下函数来处理我的文件上传:
function test_upload()
{
require_once(ABSPATH . "wp-admin" . '/includes/image.php');
require_once(ABSPATH . "wp-admin" . '/includes/file.php');
require_once(ABSPATH . "wp-admin" . '/includes/media.php');
$filename = $_POST['filename'];
$attachment_id = media_handle_upload( $filename, '1' );
print_r($attachment_id);
}
我正在尝试传递文件名,因为第一个参数的 media_handle_upload 代码(在我的示例中为 $filename)这样说:
Index into the $_FILES array of the upload
如何成功使用 WP 上传此文件,使用 AJAX 向我传递 POST 变量而不是 $_FILES 变量?
编辑:当我目前这样做时,我得到一个 WP_ERROR 说文件是空的。我用 JS 代码创建了一个 pastebin 来处理文件处理表单,这样你就可以看到文件名的来源。 http://pastebin.com/Shc4KqX1
这是文件输入:
<input type="file" name="file" />
【问题讨论】:
-
XHR2 允许通过 ajax 上传文件,就像您使用常规表单一样,尽管我假设您在某个时间点有一个 File/Blob 对象
-
@Musa 不确定那是什么。我确实在代码
file = files[$file.data('index')];中看到了这一点 -
它允许您上传文件而无需将它们转换为字符串,请参阅stackoverflow.com/questions/166221/…
-
@Musa 我放了一个 pastebin,显示了整个 JS 代码如何处理文件输入表单。