`

Ueditor(三):将图片上传至项目外的目录

阅读更多

Ueditor的图片上传默认是上传到项目下的,而项目所处目录是通过controller.jsp中的application.getRealPath( "/" )传进去的。可惜的是这个目录不能改,改了之后会出现一个很常见的问题——后端配置项没有正常加载,上传插件不能正常使用,因为需要利用这个目录查找配置文件及其他一些文件的路径。

所以要想将图片上传到项目外,只能修改源码。

 

改的思路有很多种,我这里用的是在config.json文件中添加一个属性,然后后台读取,具体步骤和代码如下:

1、在config.json文件的末尾添加属性

"outsideSavePath":"D:/bfp"/*项目外部链接,默认情况下是在项目底下,配置该字段之后可以配置在项目外面*/

这里有两个注意点:

a、在上一个属性的末尾添加逗号

b、添加注释时一定要用/**/的形式,使用别的注释形式如//会报错,错误也是经典的后端配置项没有正常加载,上传插件不能正常使用

 

2、在ConfigManager.java的getConfig ( int type ) 方法中添加对该属性的读取

conf.put("outsideSavePath",this.jsonConfig.getString( "outsideSavePath"));//项目外部路径
conf.put( "savePath", savePath );
conf.put( "rootPath", this.rootPath );
return conf;

我这里存的是outsideSavePath

 

3、在图片上传的BinaryUploader.java的save()方法中读取该属性

String physicalPath="";
 //若有指定项目外配置路径则使用外配路径,否则使用项目内路径
if(conf.get("outsideSavePath")!=null && conf.get("outsideSavePath").toString().trim().length()>0){
      physicalPath = (String) conf.get("outsideSavePath") + savePath;
      savePath = physicalPath;//将绝对物理路径返回
}else{
      //项目内的,将相对物理路径返回
      physicalPath = (String) conf.get("rootPath") + savePath;
}

该方法的完整代码如下:

public static final State save(HttpServletRequest request,
		Map<String, Object> conf) {
	FileItemStream fileStream = null;
	boolean isAjaxUpload = request.getHeader( "X_Requested_With" ) != null;

	if (!ServletFileUpload.isMultipartContent(request)) {
		return new BaseState(false, AppInfo.NOT_MULTIPART_CONTENT);
	}

	ServletFileUpload upload = new ServletFileUpload(
			new DiskFileItemFactory());

    if ( isAjaxUpload ) {
        upload.setHeaderEncoding( "UTF-8" );
    }

	try {
		FileItemIterator iterator = upload.getItemIterator(request);

		while (iterator.hasNext()) {
			fileStream = iterator.next();

			if (!fileStream.isFormField())
				break;
			fileStream = null;
		}

		if (fileStream == null) {
			return new BaseState(false, AppInfo.NOTFOUND_UPLOAD_DATA);
		}

		String savePath = (String) conf.get("savePath");
		String originFileName = fileStream.getName();
		String suffix = FileType.getSuffixByFilename(originFileName);

		originFileName = originFileName.substring(0,
				originFileName.length() - suffix.length());
		savePath = savePath + suffix;

		long maxSize = ((Long) conf.get("maxSize")).longValue();

		if (!validType(suffix, (String[]) conf.get("allowFiles"))) {
			return new BaseState(false, AppInfo.NOT_ALLOW_FILE_TYPE);
		}

		savePath = PathFormat.parse(savePath, originFileName);
		String physicalPath="";
		//若有指定项目外配置路径则使用外配路径,否则使用项目内路径
		if(conf.get("outsideSavePath")!=null && conf.get("outsideSavePath").toString().trim().length()>0){
			physicalPath = (String) conf.get("outsideSavePath") + savePath;
			savePath = physicalPath;//将绝对物理路径返回
		}else{
			//项目内的,将相对物理路径返回
			physicalPath = (String) conf.get("rootPath") + savePath;
		}
		//System.out.println("文件上传路径:"+physicalPath);
		InputStream is = fileStream.openStream();
		State storageState = StorageManager.saveFileByInputStream(is,physicalPath, maxSize);
		is.close();

		if (storageState.isSuccess()) {
			storageState.putInfo("url", PathFormat.format(savePath));
			storageState.putInfo("type", suffix);
			storageState.putInfo("original", originFileName + suffix);
		}

		return storageState;
	} catch (FileUploadException e) {
		e.printStackTrace();
		return new BaseState(false, AppInfo.PARSE_REQUEST_ERROR);
	} catch (IOException e) {
		e.printStackTrace();
	}
	return new BaseState(false, AppInfo.IO_ERROR);
}

源码中除了BinaryUploader.java可以上传图片/文件之后,Base64Uploader.java也能实现该功能,至于两个方法什么时候用哪个没有做研究,所以我在这两个方法中都添加了这段代码。当然图片上传用的是BinaryUploader.java。

修改后的源码及源码打成的jar已经上传到附件,有需要的可以下载。

(PS:最初的源码里面所有的catch都没有printStackTrace(),因此无论系统报什么错都不会有任何提示。我是这上面吃过不好亏,所以在源码的每个catch中都添加了printStackTrace(),并且打到jar包里了。介意的勿下载

 

4、修改页面的显示方式

按照以前的思路:返回的是项目底下的路径,img标签的src直接使用路径就能显示图片了。但是这个改成服务器上的绝对物理路径了,还用以前的路径绝对显示不出来。显示图片的方式有很多,我这里使用项目外挂的方式。具体外挂步骤参考javaweb使用虚拟目录显示非项目文件下的图片信息

图片上传完成之后会进入到ueditor.all.js中的function unhtmlData(imgCi) {方法,它的具体流程我没有过多的研究,只是在html代码拼接的时候进行了拦截,修改代码如下:

var img_src = ci.src;
var widthStyle = "";
 if(img_src.indexOf("http://")!=-1 || img_src.indexOf("https://")!=-1){//表情符号
      var width = getImgWidth(img_src);
      widthStyle="style=\"width:"+width+"px;height:"+width+"px;\"";
 }else{
       img_src = formatImgSrc(img_src);
}
str = '<img '+widthStyle+' src="' + img_src + '" ' + (ci._src ? ' _src="' + ci._src + '" ' : '') 。。。。

具体代码如下:

if (img && /img/i.test(img.tagName) && (img.className != "edui-faked-video" || img.className.indexOf("edui-upload-video")!=-1) && !img.getAttribute("word_img")) {
    var first = opt.shift();
    var floatStyle = first['floatStyle'];
    delete first['floatStyle'];
    domUtils.setAttributes(img, first);
    me.execCommand('imagefloat', floatStyle);
    if (opt.length > 0) {
        range.setStartAfter(img).setCursor(false, true);
        me.execCommand('insertimage', opt);
    }

} else {
    var html = [], str = '', ci;
    ci = opt[0];
    if (opt.length == 1) {
        unhtmlData(ci);
        var img_src = ci.src;
        var widthStyle = "";
        if(img_src.indexOf("http://")!=-1 || img_src.indexOf("https://")!=-1){//表情符号
			var width = getImgWidth(img_src);
			widthStyle="style=\"width:"+width+"px;height:"+width+"px;\"";
		}else{
			img_src = formatImgSrc(img_src);
		}
        str = '<img '+widthStyle+' src="' + img_src + '" ' + (ci._src ? ' _src="' + ci._src + '" ' : '') +
            (ci.width ? 'width="' + ci.width + '" ' : '') +
            (ci.height ? ' height="' + ci.height + '" ' : '') +
            (ci['floatStyle'] == 'left' || ci['floatStyle'] == 'right' ? ' style="float:' + ci['floatStyle'] + ';"' : '') +
            (ci.title && ci.title != "" ? ' title="' + ci.title + '"' : '') +
            (ci.border && ci.border != "0" ? ' border="' + ci.border + '"' : '') +
            (ci.alt && ci.alt != "" ? ' alt="' + ci.alt + '"' : '') +
            (ci.hspace && ci.hspace != "0" ? ' hspace = "' + ci.hspace + '"' : '') +
            (ci.vspace && ci.vspace != "0" ? ' vspace = "' + ci.vspace + '"' : '') + '/>';
        if (ci['floatStyle'] == 'center') {
            str = '<p style="text-align: center">' + str + '</p>';
        }
        html.push(str);
    } else {
        for (var i = 0; ci = opt[i++];) {
            unhtmlData(ci);
            var img_src = formatImgSrc(ci.src);
            str = '<p ' + (ci['floatStyle'] == 'center' ? 'style="text-align: center" ' : '') + '><img src="' + img_src + '" ' +
                (ci.width ? 'width="' + ci.width + '" ' : '') + (ci._src ? ' _src="' + ci._src + '" ' : '') +
                (ci.height ? ' height="' + ci.height + '" ' : '') +
                ' style="' + (ci['floatStyle'] && ci['floatStyle'] != 'center' ? 'float:' + ci['floatStyle'] + ';' : '') +
                (ci.border || '') + '" ' +
                (ci.title ? ' title="' + ci.title + '"' : '') + ' /></p>';
            html.push(str);
        }
    }
    me.execCommand('insertHtml', html.join(''));
}

PS:for的那段代码在多图片上传时有用,单图片上传或使用表情都是的上一段代码

用到的两个js方法如下:

//获取url基本信息
function getURLInfo(){
	var projectName="";//项目名称
	projectName = window.location.pathname;// /XXX/XXXX!XXX.action
	projectName = projectName.substring(1,(projectName.substring(1).indexOf("/")+1));//获取第二个/所在的地点

	//协议:http
	//主机 127.0.0.1:8090
	host_URL = window.location.protocol+"//"+window.location.host;
	project_URL = host_URL+"/"+projectName;
}

//根据图片或文件保存在项目底下或者非项目底下判断图片的显示方式
function formatImgSrc(img_src){
	if(img_src.indexOf(":")!=-1){//说明用的项目外目录,那么使用外挂的形式访问图片
		img_src = host_URL+img_src.substring(2);
	}else{//使用普通方式
		img_src=project_URL+img_src;
	}
	return img_src;
}

主要功能是为img的src添加项目信息,变成类似于:http://192.168.0.100:8080/test/ueditor/20170531/img_12346799.jpg或者:http://192.168.0.100:8080/bfp/ueditor/20170531/img_12346799.jpg的目录。

注:这个目录会保存到数据库中,页面在访问的时候也会显示上面的具体路径

 

最后还有一个辅助方法,具体用途跟下一篇要讲的问题有关,这里先贴一下代码,保证完整性:

/**
 * 该方法根据表情包所在文件夹分类返回图片的粗略大小以解决表情在手机上出现拉伸的问题
 * **/
function getImgWidth(img_src){
	var width = 0;
	var bbb = img_src.substr(img_src.lastIndexOf('/', img_src.lastIndexOf('/') - 1) + 1);
	var emotion = bbb.substr(0,bbb.indexOf("/"));//表情包文件夹
	switch(emotion){
		case "babycat"://baby猫
		case "bobo"://BOBO(大部分是50x50,少数为其他大小)
		case "ldw"://绿豆蛙
		case "tsj"://兔斯基
			width=50;break
		case "face"://泡泡 表情
			width=25;break;
		case "youa"://有啊
			width=60;break;
		case "jx2"://推荐
			var ddd = bbb.substr(bbb.indexOf("/")+3,4);//名称序号
			ddd = parseInt(ddd);
			//兔斯基、绿豆蛙、bobo、baby猫
			if(ddd<=56){width=50;
			}else if(ddd>=71){//有啊
				width=60;
			}else{//泡泡表情
				width=25;
			}
			break;
	}
	return width;
}

至此,“将图片上传至项目外的目录”完成,希望对大家有所帮助。大家加油!

分享到:
评论

相关推荐

    ueditor-1.1.2_ueditor-1.1.2_ueditor_ueditor:jar:1.1.2_ueditor-1.

    ueditor-1.1.2.jar是UEditor的Java实现,它包含了一整套用于处理文本编辑、图片上传、视频插入等复杂操作的类库。这个JAR包使得开发者无需关注底层细节,只需简单调用API,就能在Java Web应用中轻松集成UEditor。其...

    修改百度的UEditor,实现图片上传到项目外的路径

    要实现图片上传到项目外的路径,我们需要配置UEditor的服务器端URL。UEditor在上传图片时,会向服务器发送一个POST请求,携带图片文件。你需要在后端设置一个接收这些请求的接口,并将图片保存到指定的非项目路径。...

    ueditor可运行上传图片Javaweb项目

    【标签】"ueditor"、"上传图片"、"Javaweb项目"分别对应了这个项目的核心技术点,ueditor的使用,图片上传的功能实现,以及整个项目基于JavaWeb的环境。 综上所述,这个压缩包文件的使用者应该能够从中获取到一个...

    Ueditor上传图片+图片回显+图片在线管理配置说明

    **Ueditor 图片上传与回显配置详解** Ueditor 是一款功能强大的富文本编辑器,广泛应用于各种内容管理系统中。在使用 Ueditor 进行文本编辑时,图片上传、回显以及在线管理功能是非常关键的。本文将详细介绍如何...

    ueditor上传图片配置

    总的来说,这个项目提供了一个完整且可直接运行的ueditor图片上传解决方案,适合对SpringBoot有一定了解,并希望快速搭建具备图片上传功能的编辑器的开发者。通过学习和研究这个项目,开发者可以深入理解ueditor与...

    UEditor上传图片测试项目

    图片上传功能的实现意味着用户可以通过UEditor编辑器选择本地图片,然后通过服务器端的处理将图片上传到指定的存储位置。相关说明文档可能包含了配置步骤、问题排查以及可能遇到的常见问题,这对于部署和使用这个...

    ueditor基本配置、图片上传配置、文件上传配置

    在项目根目录`webroot`下,ueditor位于`/resources/ueditor`,图片上传的保存路径为`/upload`,附件的保存路径为`/uploadfile`。在`ueditor.config.js`中,根据这些路径调整`imageUrl`和`filePath`的值。 【前后端...

    百度的UEditor修改图片上传路径版

    UEditor 内置了图片上传功能,允许用户在编辑文本时直接上传本地图片至服务器。默认情况下,UEditor 将图片保存在与编辑器相关的目录下,但这可能并不符合所有项目的实际需求。例如,项目可能需要将图片存储在特定的...

    ueditor实现图片上传到项目外

    具体使用方法参考下文 https://blog.csdn.net/china574512989/article/details/76260172

    ueditor上传图片不显示

    例如,如果图片上传到名为`myproject`的子目录下,则可以将`imageUrlPrefix`设置为`/myproject`。 3. **调整imagePathFormat配置**:`imagePathFormat`用于指定图片上传的具体路径格式。默认情况下,它会根据日期等...

    Java项目 UEditor扩展,UEditor上传图片到项目外部目录

    Java项目 UEditor扩展,UEditor上传图片到项目外部目录

    Java项目UEditor扩展,UEditor上传图片到项目外部目录

    Java项目UEditor扩展,UEditor上传图片到项目外部目录

    Spring+Vue整合UEditor富文本实现图片附件上传的方法

    在这个文件中,需要配置ueditor的基本参数,例如上传服务器地址、图片上传保存目录、文本文件上传保存目录等。 上传服务器配置 在upload.properties文件中,需要配置上传服务器的地址、图片上传保存目录、文本文件...

    解决百度ueditor编辑器将图片上传到非项目根路径(保存在磁盘上)修改源码版

    如果通过百度Ueditor直接将图片上传到服务器上,当你重新发布项目到服务器上,容易造成图片的丢失!为了防止该事件的发生,尽量将图片上传到磁盘上或者独立存图片的服务器上!通过修改百度Ueditor源码实现

    解决Vue使用UEditor百度编辑器,上传图片服务配置问题(源码)

    然而,将其与Vue框架结合时,可能会遇到一些配置上的挑战,尤其是图片上传服务的配置。本文将详细介绍如何解决这个问题。 首先,你需要在项目中安装Vue-UEditor封装组件,可以通过npm进行安装: ```bash npm ...

    百度ueditor支持本地与FTP上传图片

    当用户选择图片上传时,UEditor会通过FTP协议将图片文件传输到指定的FTP服务器上,同样返回图片的URL供编辑器使用。 **配置文件详解** `config.json`是百度UEditor的配置文件,用于设置编辑器的各种行为和功能。...

    基于ueditor-1.4.3.3实现图片上传到项目以外的目录下

    基于ueditor-1.4.3.3实现图片上传到项目以外的目录下

    百度ueditor修改版jar包

    最近项目集群部署需要将上传的文件都放在文件服务器,正常的上传、下载都已经通过程序处理,但是发现凡是用富文本控件ueditor中上传的图片都无法处理,目前该控件仅支持上传到项目路径下。网上搜索后,发现很多人也...

Global site tag (gtag.js) - Google Analytics