- 浏览: 53201 次
- 性别:
- 来自: 北京
文章分类
文件上传:
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 10551:代码 package com.dvnchina.i ... -
基于lucene和数据库的搜索系统:(1)
2012-05-02 17:31 0一、lucene搜索系统:系 ... -
广告项目:(4) jquery树
2012-05-03 13:50 997<%@ page language="java ... -
广告项目:(3)FTP文件上传、Freemarker、文件操作等等工具类
2012-05-03 13:50 19081.ftp工具类: /* * Copyright 2 ... -
广告项目:(2)spring的动态设置定时任务执行时间
2012-05-03 13:50 17681.定时器: 1.1 先看看配置文件:quartz. ...
相关推荐
NULL 博文链接:https://chennaid2.iteye.com/blog/1507737
从压缩包文件名称 "php1:24文本广告交换系统4242" 来看,这可能包含了源代码文件、配置文件、数据库脚本以及可能的文档资料。开发者可以研究这些文件来了解系统的架构和工作原理,甚至可以对其进行定制或扩展,以...
综合来看,这个压缩包提供了一个广告管理系统的实例,其中可能包含了用于实现广告管理的后台接口以及前端的Ajax文件上传功能。开发者可以通过查看接口文档来理解如何与广告管理系统进行数据交互,同时利用Ajax技术...
通过以上步骤,你可以成功地在项目中集成并定制NeatUpload,实现大文件上传并去除不必要的标识。不过,要注意遵守开源软件的许可协议,尊重作者的权益。同时,持续关注NeatUpload的更新,以获取最新的功能和安全修复...
4. **广告素材管理**:支持上传、预览和管理各种类型的广告素材,如图片、视频、富媒体等。 5. **广告统计与分析**:提供详细的广告点击率、曝光量、转化率等数据报告,帮助优化广告效果。 6. **支付与结算**:广告...
3. 广告创建与编辑:允许广告主上传广告素材,设置广告的展示时间、频率、目标受众等参数。 4. 投放策略:根据广告主的需求和系统策略,智能匹配合适的广告投放策略,如基于用户行为、地理位置或时间的定向投放。 5....
"素材忘记上传了,现在把源文件和影片文件压缩上传"这句话暗示了我们正在处理一个与Flash创作相关的项目。在这个项目中,创作者可能在初次上传时遗漏了一些关键文件,包括源文件和最终的播放文件。现在,他们已经将...
1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合...
在本文中,我们将深入探讨如何将GooglePlaySDK和GoogleMobile广告SDK集成到你的移动应用程序中,以便实现完整的商业项目需求。这两个SDK对于开发者来说是非常重要的工具,因为它们可以帮助你不仅在Google Play商店...
【压缩包子文件的文件名称列表】"javaxiaosxu"看起来可能是这个Java项目的文件名,但这个名字本身并不直接对应Java的任何标准包或类。通常,Java的源文件以`.java`为扩展名,而编译后的类文件以`.class`为扩展名。...
1. **index.htm**:每个目录下都有一个 index.htm 文件,其作用是防止目录被非法浏览。 2. **admincp.php**:管理员后台系统的核心文件之一,用于显示管理员权限设置界面。 3. **ajax.php**:提供 AJAX 请求处理...
2. **广告发布**:允许客户上传和管理他们的广告创意,设定展示时间和位置。 3. **项目策划**:提供在线策划工具,帮助客户制定广告策略,可能包括目标设定、预算分配、媒介选择等。 4. **效果追踪**:集成数据分析...
【标题】"hadoop上传文件共5页.pdf.zip" 暗示了这是一个关于Hadoop文件上传的教程或文档,被压缩成一个ZIP文件,包含了5页的PDF内容。Hadoop是一个开源的分布式计算框架,它允许在大规模数据集上进行高效、可靠和可...
2. `upload`: 可能是上传工具,与广告图片的上传和管理有关,允许用户上传广告素材。 3. `json`: JSON文件可能包含配置信息,如广告的布局、位置、显示时间等,方便进行动态配置。 4. `file`: 可能存储了广告图片或...
【广告发布系统】是一个典型的IT项目,主要用于提供一个平台,让用户和管理员能够进行广告的发布、管理和交互。在这个系统中,我们关注的核心功能包括用户登录、管理员权限管理、图片上传与展示、用户信息管理、广告...
系统需要提供广告上传、审核、支付和效果追踪等功能。 3. **网站主管理**:网站主可以申请加入联盟,获取广告代码并在自己的网站上展示。系统应有统计网站流量和点击率的能力,以便计算分成。 4. **广告匹配与投放...
这涉及到文件上传、图片处理(如缩略图生成)、广告状态管理(如审核、激活、暂停)等技术。 5. **广告投放策略**:系统可能需要支持不同的广告投放策略,如按时间、按点击量、按展示量计费。这需要对广告展示进行...
这个项目的主要目标是提供一个平台,用户可以在上面浏览、下载或定制个性化的头像和壁纸,同时具备推广和广告功能。 一、微信小程序介绍: 微信小程序是腾讯公司推出的一种轻量级应用开发框架,无需安装即可在微信...
4. **文件操作**:ZIP文件的使用表明系统可能涉及到文件上传、下载或管理,比如广告素材的存储。 5. **服务器配置**:部署此类系统需要了解IIS(Internet Information Services)或其他Web服务器的配置,确保ASP...