如何使用Ivan Novakov在ExtJS Upload Widget中使用额外的参数

问题描述 投票:1回答:1

我正在Web应用程序中使用this upload widget

我正在使用FormDataUploader,并且能够很好地将文件上传到服务器目录。但是,我想向处理上传的php文件发送额外的参数。这是我尝试过的:

var uploadPanel = Ext.create('Ext.ux.upload.Panel', {
    uploader : 'Ext.ux.upload.uploader.FormDataUploader',

    uploaderOptions : {
       url : 'uploadGallery.php'
    },

    synchronous : true,

    uploadParams : {
        ID_Person : ID_Person,
        ID_CI : ID_CI
    }

});

如您所见,我使用了uploadParams,但是我的PHP似乎没有收到它。在我的php文件中,我有:

$ID_Person = $_GET['ID_Person'];
$ID_CI = $_GET['ID_CI'];

但是,我的PHP似乎无法获得这些参数。

接下来,我使用默认的ExtJS Uploader这样:

var uploadPanel = Ext.create('Ext.ux.upload.Panel', {
    uploaderOptions : {
        url : 'uploadExtJS.php'

    },

    synchronous : true,

    uploadParams : {
        ID_Person : ID_Person,
        ID_CI : ID_CI
    }

});

起初,我使用了旧的PHP文件,该文件能够获得我发送的额外参数。但是,似乎我需要为ExtJS上传器使用其他PHP文件。

这是我的PHP文件的外观:

<?php
/**
 * Example processing of raw PUT/POST uploaded files.
 * File metadata may be sent through appropriate HTTP headers:
 *   - file name - the 'X-File-Name' proprietary header
 *   - file size - the standard 'Content-Length' header or the 'X-File-Size' proprietary header
 *   - file type - the standard 'Content-Type' header or the 'X-File-Type' proprietary header
 * 
 * Raw data are read from the standard input.
 * The response should be a JSON encoded string with these items:
 *   - success (boolean) - if the upload has been successful
 *   - message (string) - optional message, useful in case of error
 */
require __DIR__ . '_common.php';
$config = require __DIR__ . '_config.php';

error_reporting(-1);
ini_set('display_errors', 'On');

/*
 * You should check these values for XSS or SQL injection.
 */
if (!isset($_SERVER['HTTP_X_FILE_NAME'])) {
    _error('Unknown file name');
}
$fileName = $_SERVER['HTTP_X_FILE_NAME'];
if (isset($_SERVER['HTTP_X_FILENAME_ENCODER']) && 'base64' == $_SERVER['HTTP_X_FILENAME_ENCODER']) {
    $fileName = base64_decode($fileName);
}
$fileName = htmlspecialchars($fileName);

$mimeType = htmlspecialchars($_SERVER['HTTP_X_FILE_TYPE']);
$size = intval($_SERVER['HTTP_X_FILE_SIZE']);


$inputStream = fopen('php://input', 'r');
// $outputFilename = $config['upload_dir'] . '/' . $fileName;
$outputFilename = 'gallery' . '/' . $fileName;
$realSize = 0;
$data = '';

if ($inputStream) {
    if (! $config['fake']) {
        $outputStream = fopen($outputFilename, 'w');
        if (! $outputStream) {
            _error('Error creating local file');
        }
    }

    while (! feof($inputStream)) {
        $bytesWritten = 0;
        $data = fread($inputStream, 1024);

        if (! $config['fake']) {
            $bytesWritten = fwrite($outputStream, $data);
        } else {
            $bytesWritten = strlen($data);
        }

        if (false === $bytesWritten) {
            _error('Error writing data to file');
        }
        $realSize += $bytesWritten;
    }

    if (! $config['fake']) {
        fclose($outputStream);
    }
} else {
    _error('Error reading input');
}

if ($realSize != $size) {
    _error('The actual size differs from the declared size in the headers');
}

_log(sprintf("[raw] Uploaded %s, %s, %d byte(s)", $fileName, $mimeType, $realSize));
_response();

但是,我收到一个内部服务器500错误-表示我的php文件可能存在问题。

我主要有两个问题:

  1. 如何使uploadParams与FormDataUploader一起使用?
  2. 如何为ExtJS数据上传器编写PHP上传器?
javascript php extjs extjs4
1个回答
0
投票

让它开始工作。

uploadExtJS.php文件应如下所示:

<?php
/**
 * Example processing of raw PUT/POST uploaded files.
 * File metadata may be sent through appropriate HTTP headers:
 *   - file name - the 'X-File-Name' proprietary header
 *   - file size - the standard 'Content-Length' header or the 'X-File-Size' proprietary header
 *   - file type - the standard 'Content-Type' header or the 'X-File-Type' proprietary header
 * 
 * Raw data are read from the standard input.
 * The response should be a JSON encoded string with these items:
 *   - success (boolean) - if the upload has been successful
 *   - message (string) - optional message, useful in case of error
 */
// require  __DIR__ . '_common.php';
// $config = require  __DIR__ .  '_config.php';

require_once '_common.php';
$config = require_once '_config.php';

error_reporting(-1);
ini_set('display_errors', 'On');

/*
 * You should check these values for XSS or SQL injection.
 */
if (!isset($_SERVER['HTTP_X_FILE_NAME'])) {
    _error('Unknown file name');
}
$fileName = $_SERVER['HTTP_X_FILE_NAME'];
if (isset($_SERVER['HTTP_X_FILENAME_ENCODER']) && 'base64' == $_SERVER['HTTP_X_FILENAME_ENCODER']) {
    $fileName = base64_decode($fileName);
}
$fileName = htmlspecialchars($fileName);

$mimeType = htmlspecialchars($_SERVER['HTTP_X_FILE_TYPE']);
$size = intval($_SERVER['HTTP_X_FILE_SIZE']);


$inputStream = fopen('php://input', 'r');
$outputFilename = $config['upload_dir'] . '/' . $fileName;
// $outputFilename = 'gallery' . '/' . $fileName;
$realSize = 0;
$data = '';

if ($inputStream) {
    if (! $config['fake']) {
        $outputStream = fopen($outputFilename, 'w');
        if (! $outputStream) {
            _error('Error creating local file');
        }
    }

    while (! feof($inputStream)) {
        $bytesWritten = 0;
        $data = fread($inputStream, 1024);

        if (! $config['fake']) {
            $bytesWritten = fwrite($outputStream, $data);
        } else {
            $bytesWritten = strlen($data);
        }

        if (false === $bytesWritten) {
            _error('Error writing data to file');
        }
        $realSize += $bytesWritten;
    }

    if (! $config['fake']) {
        fclose($outputStream);
    }
} else {
    _error('Error reading input');
}

if ($realSize != $size) {
    _error('The actual size differs from the declared size in the headers');
}

_log(sprintf("[raw] Uploaded %s, %s, %d byte(s)", $fileName, $mimeType, $realSize));
_response(true, "okay");

_ common.php看起来像:

<?php

function _log($value){
    error_log(print_r($value, true));
}


function _response($success = true, $message = 'OK'){
    $response = array(
        'success' => $success,
        'message' => $message
    );

    echo json_encode($response);
    exit();
}

function _error($message){
    return _response(false, $message);
}

_ config.php应该看起来像:

<?php
return array(
    'upload_dir' => 'gallery',
    'fake' => false
);
?>

现在,我正在使用uniqid()microtime()使用唯一名称,并使用uploadParams()属性将图像保存到子目录(或主上载/图库文件夹下的任何文件夹)。

编辑1:重新命名上传的文件

只需更改此行:

$fileName = htmlspecialchars($fileName);

至:

$fileName = uniqid() . '_' . microtime();

编辑3:从您的附加参数中获取自定义子目录

首先,请确保您从ExtJS Web应用程序创建上载对话框时,执行此操作:

var uploadPanel = Ext.create('Ext.ux.upload.Panel', {
    uploaderOptions : {
        url : 'uploadExtJS.php'

    },
    synchronous : true,
    uploadParams : {
        ID_1 : ID_1,
        ID_2 : ID_2 // you can put waaay more if you want
    }
});

并且在您的uploadExtJS.php中,执行此操作(在定义新文件名的部分和检查输入流的部分之间)

$fileName = uniqid() . '_' . microtime();

$mimeType = htmlspecialchars($_SERVER['HTTP_X_FILE_TYPE']);
$size = intval($_SERVER['HTTP_X_FILE_SIZE']);

$ID_1 = $_GET['ID_1'];
$ID_2 = $_GET['ID_2'];

$newFilePath = $config['upload_dir'] . '/' . $ID_1 . '/' . $ID_2;

if (!file_exists($newFilePath)) {
    mkdir($newFilePath, 0777, true);
}

$inputStream = fopen('php://input', 'r');
$outputFilename = $newFilePath . '/' . $fileName;

$realSize = 0;
$data = '';

如您所见,我定义了一个$newFilePath变量,在创建它之前检查它是否存在,然后将其上传到该目录。

希望这对以后遇到此问题的任何人都有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.