使用文件

时间:2015-11-16 22:13:55

标签: php jquery ajax forms

我有一个通过$ .post处理的表单,将数据发送到php脚本。我的客户刚要求我提供使用此(以及其他一些)表单上传图像的功能。

我一直在谷歌搜索大约一个小时,并且没有看到任何证据表明你可以使用$.post()实际做到这一点,所以我想伸手去看看是否有办法做此

表单以这种方式处理:

jQuery( '.js-saveProduct' ).click(function(e) {
    e.preventDefault();
    acSaveProduct( jQuery(this).serializeArray() )
};

var acSaveProduct = function( form ) {
    var _data = {
        action: 'ac_save_product',
        form: JSON.stringify( form )
    }

    jQuery.post(
        ajaxscript.ajaxurl,
        _data,
        function( response ) {
            // Do Stuff
        }
    );
};

如果在调用console.log(form)之后我acSaveProduct(),则上传字段甚至不会记录在被记录的对象数组中。

我还没有开始PHP的这一方面,因为我知道传递给我的PHP函数的表单对象不包含我正在寻找的值。

编辑以显示新的尝试

所以,尝试@Andreas链接的技术,我仍然遇到麻烦。下面是我的更新jQuery / PHP代码:

HTML

<input type="file" name="acImageNew" id="acImageNew">

的jQuery

var acSaveProductAlt = function( form ) {
    var file_data = jQuery( '#acImageNew' ).prop('files')[0];
    var form_data = new FormData();
    form_data.append('file', file_data);

    alert(form_data);

    jQuery.ajax({
        url: the_ajax_script.ajaxurl,
        dataType: 'json',
        cache: false,
        contentType: false,
        processData: false,
        data: form_data,
        type: 'post',
        action: 'ac_ajax_save_product_alt',
        success: function( response ) {
            alert(JSON.parse(response.success));
        }
    });
};

PHP

function ac_ajax_save_product_alt(){
    if ( 0 < $_FILES['file']['error'] ) {
        echo 'Error: ' . $_FILES['file']['error'] . '<br>';
    }
    else {
        move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);
    }

    $response = json_encode(
        array(
            'success' => true,
        )
    );

    header( "Content-Type: application/json" );
    echo $response;
    exit;
}

最后,我收到一条警告0作为警报的内容。我做错了什么?

1 个答案:

答案 0 :(得分:1)

首先尝试JSON解析响应,然后访问interface Copyable { Copyable copy(); } class ImplA implements Copyable { private String field; public ImplA(ImplA implA) { this.field = implA.field; } @Override public ImplA copy() { return new ImplA(this); } // other constructors and methods that mutate state. } class ImplB extends ImplA { private int value; private final List<String> list; // This field could not be final if we used clone. public ImplB(ImplB implB) { super(implB); // Here we invoke the copy constructor of the super class. this.value = implB.value; this.list = new ArrayList<>(implB.list); } @Override public final ImplB copy() { return new ImplB(this); } // other constructors and methods that mutate state. } 密钥。

success