0

我尝试使用 nicupload 插件实现 nicEdit,但是当我选择要上传的文件时,它显示“上传图像失败”,并且服务器响应显示“上传 ID 无效”。

这是调用脚本并初始化的代码:

<script src="http://js.nicedit.com/nicEdit-latest.js" type="text/javascript"></script>
<script type="text/javascript">//<![CDATA[
bkLib.onDomLoaded(function() {
new nicEditor({uploadURI : '../../nicedit/nicUpload.php'}).panelInstance('area1');
});
//]]>
</script>

nicUpload.php 的路径是正确的,代码是可以在文档中找到的那个:http: //nicedit.com/src/nicUpload/nicUpload.js

我对上传文件夹进行了更改,并设置了写入权限。根据文档(http://wiki.nicedit.com/w/page/515/Configuration%20Options),仅此而已,但我不断收到错误。有任何想法吗?

4

2 回答 2

2

在寻找解决方案很长时间后(很多帖子没有真正的解决方案),我现在自己修复了代码。我现在可以将图像上传到我自己的服务器。感谢萤火虫和日食;-)

主要问题是 nicUpload.php 是旧的,不能与当前的 nicEdit-Upload 函数一起使用。

缺少的是错误处理,请随时添加...

nicEditor 添加到您的 php 文件并将其配置为使用 nicEdit.php:

new nicEditor({iconsPath : 'pics/nicEditorIcons.gif', uploadURI : 'script/nicUpload.php'}

下载未压缩的 nicEdit.js并在 nicEdit.js 中更改以下行:

uploadFile : function() {
var file = this.fileInput.files[0];
if (!file || !file.type.match(/image.*/)) {
  this.onError("Only image files can be uploaded");
  return;
}
this.fileInput.setStyle({ display: 'none' });
this.setProgress(0);

var fd = new FormData(); 
fd.append("image", file);
fd.append("key", "b7ea18a4ecbda8e92203fa4968d10660");
var xhr = new XMLHttpRequest();
xhr.open("POST", this.ne.options.uploadURI || this.nicURI);

xhr.onload = function() {
  try {
    var res = JSON.parse(xhr.responseText);
  } catch(e) {
    return this.onError();
  }
  //this.onUploaded(res.upload); // CHANGE HERE
  this.onUploaded(res);
}.closure(this);
xhr.onerror = this.onError.closure(this);
xhr.upload.onprogress = function(e) {
  this.setProgress(e.loaded / e.total);
}.closure(this);
xhr.send(fd);

},

onUploaded : function(options) {
this.removePane();
//var src = options.links.original; // CHANGE HERE
var src = options['url'];
if(!this.im) {
  this.ne.selectedInstance.restoreRng();
  //var tmp = 'javascript:nicImTemp();';
  this.ne.nicCommand("insertImage", src);
  this.im = this.findElm('IMG','src', src);
}
var w = parseInt(this.ne.selectedInstance.elm.getStyle('width'));
if(this.im) {
  this.im.setAttributes({
    src : src,
    width : (w && options.image.width) ? Math.min(w, options.image.width) : ''
  });
}

}

像这样更改nicUpload.php

<?php
/* NicEdit - Micro Inline WYSIWYG
 * Copyright 2007-2009 Brian Kirchoff
 *
 * NicEdit is distributed under the terms of the MIT license
 * For more information visit http://nicedit.com/
 * Do not remove this copyright message
 *
 * nicUpload Reciever Script PHP Edition
 * @description: Save images uploaded for a users computer to a directory, and
 * return the URL of the image to the client for use in nicEdit
 * @author: Brian Kirchoff <briankircho@gmail.com>
 * @sponsored by: DotConcepts (http://www.dotconcepts.net)
 * @version: 0.9.0
 */

/* 
* @author: Christoph Pahre
* @version: 0.1
* @description: different modification, so that this php file is working with the newest nicEdit.js (needs also modification - @see) 
* @see http://stackoverflow.com/questions/11677128/nicupload-says-invalid-upload-id-cant-make-it-works
*/

define('NICUPLOAD_PATH', '../images/uploadedImages'); // Set the path (relative or absolute) to
                                      // the directory to save image files

define('NICUPLOAD_URI', '../images/uploadedImages');   // Set the URL (relative or absolute) to
                                      // the directory defined above

$nicupload_allowed_extensions = array('jpg','jpeg','png','gif','bmp');

if(!function_exists('json_encode')) {
    die('{"error" : "Image upload host does not have the required dependicies (json_encode/decode)"}');
}

if($_SERVER['REQUEST_METHOD']=='POST') { // Upload is complete

    $file = $_FILES['image'];
    $image = $file['tmp_name'];
    $id = $file['name'];

    $max_upload_size = ini_max_upload_size();
    if(!$file) {
        nicupload_error('Must be less than '.bytes_to_readable($max_upload_size));
    }

    $ext = strtolower(substr(strrchr($file['name'], '.'), 1));
    @$size = getimagesize($image);
    if(!$size || !in_array($ext, $nicupload_allowed_extensions)) {
        nicupload_error('Invalid image file, must be a valid image less than '.bytes_to_readable($max_upload_size));
    }

    $filename = $id;
    $path = NICUPLOAD_PATH.'/'.$filename;

    if(!move_uploaded_file($image, $path)) {
        nicupload_error('Server error, failed to move file');
    }

    $status = array();
    $status['done'] = 1;
    $status['width'] = $size[0];
    $rp = realpath($path);
    $status['url'] =  NICUPLOAD_URI ."/".$id;


    nicupload_output($status, false);
    exit;
} 

// UTILITY FUNCTIONS

function nicupload_error($msg) {
    echo nicupload_output(array('error' => $msg)); 
}

function nicupload_output($status, $showLoadingMsg = false) {
    $script = json_encode($status);
    $script = str_replace("\\/", '/', $script);
    echo $script;

    exit;
}

function ini_max_upload_size() {
    $post_size = ini_get('post_max_size');
    $upload_size = ini_get('upload_max_filesize');
    if(!$post_size) $post_size = '8M';
    if(!$upload_size) $upload_size = '2M';

    return min( ini_bytes_from_string($post_size), ini_bytes_from_string($upload_size) );
}

function ini_bytes_from_string($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);
    switch($last) {
        // The 'G' modifier is available since PHP 5.1.0
        case 'g':
            $val *= 1024;
        case 'm':
            $val *= 1024;
        case 'k':
            $val *= 1024;
    }
    return $val;
}

function bytes_to_readable( $bytes ) {
    if ($bytes<=0)
        return '0 Byte';

    $convention=1000; //[1000->10^x|1024->2^x]
    $s=array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB');
    $e=floor(log($bytes,$convention));
    return round($bytes/pow($convention,$e),2).' '.$s[$e];
}

?>
于 2013-04-27T12:22:28.290 回答
1

您可以手动将 id 传递给您的脚本:例如 nicUpload.php?id=introPicHeader,它将在您定义的图像文件夹中变为 introPicHeader.jpg(或适当的扩展名)。

但是,我注意到此脚本已损坏,如果在 nicEditorAdvancedButton.extend({ 期间直接在 nicEdit.js 中指定,则无法访问配置选项 uploadURI。这会导致访问相对路径的“未知”资源,从而导致错误。

文档另有暗示,并且在此处为 imgur.com 指定了 nicURI 的事实(可能是默认设置)给我的印象是,我还可以在一个地方而不是在每个编辑器实例中添加对 nicUpload.php 脚本的 uploadURI 引用.

更新

如果您在实例化期间传递它,这将起作用,我猜这确实允许轻松的动态 id 填充。

不幸的是,nicUpload.php 充满了错误,它的输出不是 JSON。编辑器希望解析 JSON 并找到带有意外标记“<”的脚本标记和错误。

我将尝试识别大量其他错误:

在 nicEdit.js

  1. A.append("image") 实际上应该是 A.append("nicImage")
  2. this.onUploaded(D.upload) 应该变成 this.onUploaded(D)
  3. this.onUploaded(D) 应该移到 var D=JSON.parse(C.responseText) 之后的 try 块内以修复变量范围问题
  4. B.image.width 需要变成 B.width

在 nicUpload.php

  1. JSON 输出格式不正确,注释掉 html 输出,只输出 json_encode($status)。
  2. JSON 输出需要返回一个名为 links 而不是 url 的键/值对,尽管在 nicEdit.js 中将 var D=B.links 重命名为 var D=B.url 也足以解决问题。

php 和 javascript 代码都有很多不足之处,我经常遇到很多错误,并且一直在自己修复它们。

于 2012-07-27T11:54:40.247 回答