- 浏览: 51177 次
- 性别:
- 来自: 北京
文章分类
文件上传:
Struts文件上传心得:
1.使用 org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper;这个拦截器,在action被调用之前,会首先走到fileUpload拦截器(对应的是FileUploadInterceptor类),在这个拦截器中,会先看一下request是不是 MultiPartRequestWrapper,如果不是,就说明不是上传文件用的request,fildUpload拦截器会直接将控制权交给下一个拦截器;如果是,就会把request对象强转为MultiPartRequestWrapper对象,然后调用hasErrors方法,看看有没有上传时候产生的错误,有的话,就直接加到了Action的错误(Action级别的)中了。另外,在fileUpload拦截器中会将MultiPartRequestWrapper对象中放置的文件全取出来,把文件、文件名、文件类型取出来,放到request的parameters中,这样到了params拦截器时,就可以轻松的将这些内容注入到Action中了,这也就是为什么fileUpload拦截器需要放在params拦截器前面的理由。在文件都放到request的parameters对象里之后,fileUpload拦截器会继续调用其他拦截器直到Action等执行完毕,他还要做一个扫尾的工作:把临时文件夹中的文件删除(这些文件是由commons-fileupload组件上传的,供你在自己的Action中将文件copy到指定的目录下,当action执行完了后,这些临时文件当然就没用了)。
2.Struts 2的文件上传,底层还是由apache的commons-fileupload 实现的。
3.配置文件:
<!-- 上传的文件存放目录 -->
4.页面的标签:标签的名字一是“upload” <input title="浏览..." value="" id="file_id" name="upload" class="e_inputfile" onfocus="this.className='e_inputFocusfile'" onblur="this.className='e_inputfile'" type="file" /> 5.1 页面代码: upload.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!-- JQUERY 主要JS库 --> <script type="text/javascript"> var sel_node_id; //检查input框,路径不能为空 } var nodeId = getObj("treeNodeId").value; if(nodeId == null || nodeId == undefined){ var form = $("form[name=form1]"); //其中的form1是我form的名称 <script type="text/javascript"> //加载树 <!-- <input type="hidden" value="" id="treeNodeId" /> <table cellpadding="0" cellspacing="1" class="servicesT">
<constant name="struts.multipart.saveDir" value="tmp"/>
<!-- 参数struts.multipart.maxSize 为文件尺寸 默认是2M,如果不进行配置上传超出2M,会抛出错误 -->
<constant name="struts.multipart.maxSize" value="2000000" />
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<%@ taglib prefix="c" uri="/WEB-INF/tags/c.tld" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>广告系统</title>
<link href="<%=path %>/css/platform.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="<%=path %>/js/lib/jquery.js"></script>
<!-- JSTREE 主要JS库-->
<script type="text/javascript" src="<%=path %>/js/lib/jquery.cookie.js"></script>
<script type="text/javascript" src="<%=path %>/js/lib/jquery.hotkeys.js"></script>
<script type="text/javascript" src="<%=path %>/js/jquery.jstree.js"></script>
<script type="text/javascript" src="<%=path %>/js/util.js"></script>
<script type="text/javascript" src="<%=path %>/jquery/jquery.form.js"></script>
function changeBody(index){
switch(index){
case 1:{
document.getElementById('wm-info').style.display = "";
break;
}
}
}
function close(){
ocument.getElementById("wm-info").style.display ="none";
}
</script>
<script type="text/javascript">
//公共方法--获得dom对象
function getObj(id){
var obj = document.getElementById(id);
return obj;
}
//公共方法-选择下拉框的值
function selectOptionVal(id){
var positionVal="-1";
var selectPobj = getObj(id);
var options = selectPobj.options;
for(var i = 0; i < options.length; i++){
var optionResult = options[i].selected ;
if(optionResult){
positionVal = options[i].value;
}
}
return positionVal;
}
function checkFileName(){
var uploadFilePath = getObj("file_id").value;
//alert("上传文件的路径"+uploadFilePath);
if(uploadFilePath == "" || uploadFilePath == null || uploadFilePath == undefined){
alert("上传的文件不能为空!");
return false;
}
return true;
}
//检查通过开始提交,后开始验证到上传文件
function submitForm(nodeId,materialTypeVal,postionTypeVal,positionVal,iscover){
var form = $("form[name=form1]"); //其中的form1是我form的名称
var options = {
url:'<%=application.getContextPath() %>/material/checkMaterial.do',
type:'post',
dataType:'json',
data: {nodeTypeId:nodeId,materialType:materialTypeVal,postionType:postionTypeVal, positionId:positionVal,cover:iscover},
success:function(data){
var flag = data.result;
if(flag){
alert("上传成功");
}else{
alert("上传失败,原因:"+data.msg);
}
}
};
form.ajaxSubmit(options);
//提交前先审核
function checkFile(){
alert("请选择素材分类树的节点!");
return;
}
//确定那个素材分类
var materialType = selectOptionVal("sel_material_type");
if(materialType == "-1"){
alert("请选择-素材分类!");
return;
}
//确定那个素材类型
var postionType = selectOptionVal("sel_postion_type");
if(postionType == "-1"){
alert("请选择-素材类型!");
return;
}
//确定那个广告位的素材
var positionVal = selectOptionVal("sel_postion_id");
if(positionVal == "-1"){
alert("请选择-广告位!");
return;
}
if(!checkFileName()){
return;
}
var options = {
url:'<%=application.getContextPath() %>/material/checkFileName.do',
type:'post',
dataType:'json',
data: {nodeTypeId:nodeId},
success:function(data){
var flag = data.result;
var isHasSame = data.isHasSame;
if(flag){
if(isHasSame){
if(confirm("有同名的文件,确定要覆盖吗?")){
submitForm(nodeId,materialType,postionType,positionVal,1);
}else{
alert("请您修改上传文件的名字!");
}
}else{
submitForm(nodeId,materialType,postionType,positionVal,0);
}
}else{
alert("上传失败,原因:"+data.msg);
}
},
async:false
};
form.ajaxSubmit(options);
}
</script>
function init(){
$.ajax({
type:"post",
//url: getContextPath() + '/material/listMaterialType.do',
url: "<%=application.getContextPath() %>/material/listMaterialType.do",
dataType :"String",
success:function(json){
var str = json.replace(/\"id"/g, 'attr:{"id"');
var str2 = str.replace(/\,"data"/g, '},data');
var jsondata = eval(str2);
jtree(jsondata);
},
error:function(){
alert("服务器异常,请稍后重试!");
},
async:false
});
}
function jtree(o){
var ctxPath = "<%=path%>";
$("#tree").jstree(
//json加载数据节点
{
//json数据区域
"json_data" :{data:o}
,
//要使用到的插件
"plugins" : [ "themes", "json_data", "ui", "crrm", "cookies", "types"]
,
"types" : {
"max_depth" : -2,
"max_children" : -2,
"valid_children" : [ "drive" ],
"types" : {
"default" : {
"valid_children" :"none",
"icon" : {
"image" : ctxPath+"/images/folder.png"
}
}
}
}
})
//选择事件
.bind("select_node.jstree", function(e, data) {
var id = parseInt(data.rslt.obj.attr("id"));
document.getElementById("treeNodeId").value =id;
})
}
</script>
</head>
<body onload="init()">
<form action="" id="form1" name="form1" enctype="multipart/form-data" >
-->
<form action="" id="form1" name="form1" >
<tr>
<th class="formTitle" colspan="99">
<span>上传素材</span>
</th>
</tr>
<tr>
<td class="td_label">选择素材分类:</td>
<td class="td_input">
<select id="sel_material_type" onchange="selectOptionVal(this.id)" class="e_select" onfocus="this.className='e_selectFocus'" onblur="this.className='e_select'" >
<option id="ad_id" value="-1">请选择...</option>
<c:forEach items="${mKindList}" var="materialBean">
<option value="${materialBean.id }">${materialBean.name }</option>
</c:forEach>
<!--
<option value="0" >文字</option>
<option value="1" >图片</option>
<option value="2" >视频</option>
<option value="3" >压缩包</option>
-->
</select>
</td>
<td class="td_label">选择素材类型:</td>
<td class="td_input">
<select id="sel_postion_type" onchange="selectOptionVal(this.id)" class="e_select" onfocus="this.className='e_selectFocus'" onblur="this.className='e_select'" >
<option id="ad_id" value="-1">请选择...</option>
<c:forEach items="${mTypeList}" var="materialBean">
<option value="${materialBean.id }">${materialBean.name }</option>
</c:forEach>
<!--
<option value="1" >标清</option>
<option value="2" >高清</option>
-->
</select>
</td>
<!-- <td class="td_label">选择广告位:</td>
<td class="td_input">
<select id="sel_postion_id" onchange="selectOptionVal(this.id)" class="e_select" onfocus="this.className='e_selectFocus'" onblur="this.className='e_select'" >
<option id="ad_id" value="-1">请选择...</option>
<c:forEach items="${pNameList}" var="positionBean">
<option value="${positionBean.id }">${positionBean.positionNameCn }</option>
</c:forEach>
<option id="ad_id" value="1">换台广告</option>
<option id="ad_id" value="2">音量广告</option>
<option id="ad_id" value="3">频道列表广告</option>
<option id="ad_id" value="4">循环播放广告</option>
<option id="ad_id" value="5">菜单广告</option>
</select>
</td> -->
</tr>
<tr>
<td class="td_label">选择广告位:</td>
<td class="td_input"><select id="sel_postion_id" onchange="selectOptionVal(this.id)" class="e_select" onfocus="this.className='e_selectFocus'" onblur="this.className='e_select'" >
<option id="ad_id" value="-1">请选择...</option>
<c:forEach items="${pNameList}" var="positionBean">
<option value="${positionBean.id }">${positionBean.positionNameCn }</option>
</c:forEach>
<!--
<option id="ad_id" value="1">换台广告</option>
<option id="ad_id" value="2">音量广告</option>
<option id="ad_id" value="3">频道列表广告</option>
<option id="ad_id" value="4">循环播放广告</option>
<option id="ad_id" value="5">菜单广告</option>
-->
</select> </td>
<td class="td_label">选择文件:</td>
<td class="td_input">
<input title="浏览..." value="" id="file_id" name="upload" class="e_inputfile" onfocus="this.className='e_inputFocusfile'" onblur="this.className='e_inputfile'" type="file" /> </td>
</tr>
<tr>
<td class="td_labela">选择类型:<br /><br />(大类别包括多个小类别)</td>
<td colspan="5" class="td_inputaa" valign="top">
<div id="tree" class="tree" ></div>
</td>
</tr>
<tr>
<td class="formBottom" colspan="99">
<input name="Submit"
type="button"
title="上传"
class="b_next"
value=""
onclick="checkFile()"
/>
</td>
</tr>
</table>
</form>
</body>
</html>
<?xml version="1.0" encoding="UTF-8" ?> <include file="struts/struts-playItem.xml" /> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <!-- 指定Web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法 --> <!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 --> <!-- 开发模式下使用,这样可以打印出更详细的错误信息 <!-- 把action对象交给spring创建 --> <package name="material" namespace="/material" extends="struts-default"> 5.3 action的代码: public class MaterialAction extends BaseActionSupport<Object> implements ServletRequestAware{ } BaseActionSupport package com.dvnchina.itv.advert.action; import java.io.File; import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import com.dvnchina.itv.advert.utils.GenericsUtil; public class BaseActionSupport<T> extends ActionSupport{ @SuppressWarnings("unchecked") /** /** /** /** public String getContextPath() { public void setContextPath(String contextPath) { public void setQuery(String query) { public Long getId() { public void setId(Long id) { public void setStart(int start) { public int getLimit() { public void setLimit(int limit) { public String getDataJson() { public void setDataJson(String dataJson) { public String getIds() { public void setIds(String ids) { public File getUpload() { public void setUpload(File upload) { public String getUploadContentType() { public void setUploadContentType(String uploadContentType) { public String getUploadFileName() { public void setUploadFileName(String uploadFileName) {
5.2 struts.xml配置文件代码
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- global -->
<include file="struts-default.xml" />
<include file="struts-plugin.xml" />
<include file="struts/struts-twowayAdvert.xml" />
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 配置国际化相关信息 -->
<constant name="struts.custom.i18n.resources" value="struts.messageResource" />
<constant name="struts.serve.static.browserCache" value="false" />
<constant name="struts.devMode" value="true" /> -->
<constant name="struts.devMode" value="false" />
<!-- 上传的文件存放目录 -->
<constant name="struts.multipart.saveDir" value="tmp"/>
<!-- 参数struts.multipart.maxSize 为文件尺寸 默认是2M,如果不进行配置上传超出2M,会抛出错误 -->
<constant name="struts.multipart.maxSize" value="2000000" />
<constant name="struts.objectFactory" value="spring" />
<!-- 如果不是用action作为扩展名,则需要在这个地方配置扩展名,否则映射不上 -->
<constant name="struts.action.extension" value="do" />
<action name="listMaterial" class="materialAction" method="getTypes" />
<action name="listMaterialType" class="materialAction" method="listMaterialType" />
<action name="addMaterialType" class="materialAction" method="addMaterialType" />
<action name="delMaterial" class="materialAction" method="deleteMaterialType" />
<action name="updateMaterial" class="materialAction" method="updateMaterialType" />
<action name="getMaterialTypePath" class="materialAction" method="getMaterialTypePath" />
<action name="findMaterial" class="materialAction" method="findMaterial" >
<result name="success" >/page/material/materialFind.jsp</result>
</action>
<action name="checkFileName" class="materialAction" method="checkFileName" />
<action name="checkMaterial" class="materialAction" method="uploadMaterial" />
<action name="toUploaldFile" class="materialAction" method="showUploaldMaterial" >
<result name="success">/page/material/add.jsp</result>
</action>
</package>
</struts>
String tempPath = MATERIAL_TEMP_DIR + _SEPARATOR + materialName;
File dstFile = new File(tempPath);
/** 复制到临时文件夹内 */
int fileSize;
try {
fileSize = FileOperate.copyFile2FileSize(this.upload, dstFile);
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper;
import com.opensymphony.xwork2.ActionSupport;
private static final long serialVersionUID = 1510137542622373146L;
protected final Log log = LogFactory.getLog(getClass());
protected final static String SPE = File.separator;
/**
* id主键
*/
protected Long id;
/**
* 多个id字符串,以"逗号"分割
*/
protected String ids;
/**
* 工程的contextPath
*/
protected String contextPath;
/**
* extJs的页号
*/
protected int start;
/**
* extJs的分页记录
*/
protected int limit;
/**
* 页号
*/
protected int pageNo;
/**
* 每页记录数
*/
protected int pageSize;
/**
* 表格查询参数
*/
protected String query;
/**
* json格式数据
*/
protected String dataJson;
/**
* 上传的文件
*/
protected File upload;
/**
* 上传文件类型属性
*/
protected String uploadContentType;
/**
* 上传的文件名
*/
protected String uploadFileName;
@SuppressWarnings("unchecked")
protected Class clazz;
protected Class getClazz() {
return clazz;
}
@SuppressWarnings("unchecked")
public BaseActionSupport() {
Class genericClass = GenericsUtil.getGenericClass(getClass());
clazz = genericClass;
}
/**
* render Text
*/
public void renderText(String content) {
try {
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.print(content);
out.flush();
out.close();
} catch (IOException e) {
log.error(e);
}
}
* render HTML
*/
public void renderHtml(String content) {
HttpServletResponse response = null;
PrintWriter out = null;
try {
response = ServletActionContext.getResponse();
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
out = response.getWriter();
out.print(content);
out.flush();
} catch (IOException e) {
log.error("输出提示信息时出现异常",e);
} finally{
if (out!=null) {
out.close();
}
}
}
* render XML
*/
public void renderXML(String content) {
try {
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/xml");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.print(content);
out.flush();
out.close();
} catch (IOException e) {
log.error(e);
}
}
* render json
*/
public void renderJson(String content) {
try {
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/json");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.print(content);
out.flush();
out.close();
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
public PrintWriter getWriter(String encoding) throws IOException{
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html");
response.setCharacterEncoding(encoding);
PrintWriter out = response.getWriter();
return out;
}
* 取得request
* @return
*/
public HttpServletRequest getRequest(){
HttpServletRequest request = ServletActionContext.getRequest();
return request;
}
/**
* 取得MultipartRequest
* 上传文件使用
* @return
*/
public MultiPartRequestWrapper getMutipartRequest(){
MultiPartRequestWrapper mulRequest = (MultiPartRequestWrapper) ServletActionContext.getRequest();
return mulRequest;
}
/**
* get userName from session
*/
public static String getUserNameFromSesssion() {
String name = (String) ServletActionContext.getRequest().getSession().getAttribute("username");
return name;
}
/**
* get conf from configuration.properties
*/
public static String getPropertiesValue(String key) {
// PropertiesUtil.init("configuration.properties");
// String value = PropertiesUtil.getProperty(key,"");
// return value;
return null;
}
/**
* 页面跳转
*/
public String forWard() throws Exception {
return SUCCESS;
}
/**
* get project realPath
*/
public String getRealPath() {
HttpServletRequest request = (HttpServletRequest) ServletActionContext.getRequest();
String path = request.getSession().getServletContext().getRealPath("/");
return path;
}
/**
* 获取Response
* @return
*/
public HttpServletResponse getResponse(){
HttpServletResponse response = ServletActionContext.getResponse();
return response;
}
return contextPath;
}
this.contextPath = contextPath;
}
this.query = query;
}
return id;
}
this.id = id;
}
public int getStart() {
return start;
}
this.start = start;
}
return limit;
}
this.limit = limit;
}
return dataJson;
}
this.dataJson = dataJson;
}
return ids;
}
this.ids = ids;
}
return upload;
}
this.upload = upload;
}
return uploadContentType;
}
this.uploadContentType = uploadContentType;
}
return uploadFileName;
}
this.uploadFileName = uploadFileName;
}
}
发表评论
-
内容发布管理系统
2012-05-03 15:58 0在线编辑:Ckedit -
SEO调研报告
2012-05-03 15:54 0SEO 调研报告,大家分享下。 1、给我感觉,SEO真 ... -
基于lucene和数据库的搜索系统--分页:(3)
2012-05-03 15:17 0四、Lucene的搜素结果的数据分页: 代码片段: p ... -
基于lucene和数据库的搜索系统:(2)
2012-05-03 15:12 0Lucene的搜索功能非常强大,提供可扩展的过滤器,复杂的查询 ... -
广告项目:(5) 解析XMl-<1> dom4j解析
2012-05-03 14:56 10181:代码 package com.dvnchina.i ... -
基于lucene和数据库的搜索系统:(1)
2012-05-02 17:31 0一、lucene搜索系统:系 ... -
广告项目:(4) jquery树
2012-05-03 13:50 923<%@ page language="java ... -
广告项目:(3)FTP文件上传、Freemarker、文件操作等等工具类
2012-05-03 13:50 18551.ftp工具类: /* * Copyright 2 ... -
广告项目:(2)spring的动态设置定时任务执行时间
2012-05-03 13:50 17211.定时器: 1.1 先看看配置文件:quartz. ...
相关推荐
NULL 博文链接:https://chennaid2.iteye.com/blog/1507737
(1) 项目汇报文件 210 (2) 测试方案 210 4.1.9.2.5. 测试人员名单 211 4.1.10 本期项目完成交付后,技术服务计划、维护、承诺及费用 212 4.1.10.1. 概述 212 4.1.10.2. 服务内容 213 1. 咨询服务 213 2. ...
共24个demo项目 文件太大 分开上传 如下: 1.雷达扫描图 2.美女拼图游戏 3.仿饿了么点餐 4.仿京东App 5.在线音乐播放器 6.仿哔哩哔哩B站 7.地图拖拽区域检测效果 8.手写签名 9.语音识别 10.自定义图形库 11.绘图...
靠,俺没资源分了,想下东西都下不了,为此,我就在我项目中提取了2个文件上传,是对文件的管理。如UploadFiles是总的上传文件夹,下面有Pictures(普通图片)、NewsPic(新闻图片)、Adv(广告图片)、Movies (视频)、Other...
2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、...
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、...
26. 上传文件在线扫描病毒 27. 查看和摘除用户层的钩子 28. 查看和结束内核线程 29. 关机回调的清除 30. 查看和摘除mini文件驱动 31. 系统恢复功能(检测项目包括注册表关键部位,已安装的杀毒软件,AutoRun文件,...
2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...
26. 上传文件在线扫描病毒 27. 查看和摘除用户层的钩子 28. 查看和结束内核线程 29. 关机回调的清除 30. 查看和摘除mini文件驱动 31. 系统恢复功能(检测项目包括注册表关键部位,已安装的杀毒软件,AutoRun文件,...
1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合...
会员登陆注册,会员后台管理,会员积分,网站后台管理,评论点赞,收藏,网站数据录入,多媒体文件上传,多媒体文件在线播放,站内模糊搜索项目数据库表:advertisements:广告数据表,bannerlists:轮播图数据表,...
FFS上传环境服务器检测程序其实是一款探针程序,专用于 想做网盘的用户,能够检测出服务器的上传环境配置,在你 打算购买某虚拟主机或服务器之前,或者准备部署网盘程序, 使用此程序检测服务器上传环境,可以...
Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板 使用Java语言编写的一款...
1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合...
1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合...
共24个demo项目 文件太大 分开上传 如下: 1.雷达扫描图 2.美女拼图游戏 3.仿饿了么点餐 4.仿京东App 5.在线音乐播放器 6.仿哔哩哔哩B站 7.地图拖拽区域检测效果 8.手写签名 9.语音识别 10.自定义图形库 11.绘图...
4、去掉了所有帮助文件和示例文件 5、去掉了LipSync模块,该模块目前只支持Poser6、7系列人物。 6、POSER 7 精简绿色版建造人物,需要安装人物模型,请用户自行选择。另外,需要简体中文的用户与本公司联系。