学习笔记13 独立出discuz 论坛中的图片上传

本文介绍如何从Discuz论坛中独立出图片上传功能。通过分析论坛源码,发现图片上传由前端js、Flash AS 和 ASP.NET 代码三部分组成。首先,js根据浏览器类型加载Flash并传递参数,Flash将图片信息发送到ASP.NET处理,验证用户权限并上传临时文件。用户选择截图后,Flash再次调用ASP.NET完成图片裁剪和正式上传。通过解析和提取所需文件,可以将此功能应用于其他项目。
摘要由CSDN通过智能技术生成

最近2天都在搞图片上传这个东西,真是有点麻烦。

在discuz 源码中看到一图片上传的好东西,刚好可以用到项目中来。于是决定尝试下把论坛中的图片上传独立出来

黄天不负有心人。就在刚才我把它搞出来了,而且通过了测试。

先将独立出来的部分发于博客中:

通过我的观察 发现原来论坛中的flash上传图片是有三个部分组成。一是前台的js文件 二是flash中的as文件 三是asp.net中的代码处理

原理是这样的:

根据不同的浏览器js 加载flash文件和对于的参数【这个参数是页面传入的】 到flash中处理文件【这是第一步的处理,只是将图片路径和用户信息传入到-->asp.net类中】这样asp。net类中就可以得到图片路径和用户信息,在得到用户信息以后,程序判断用户是否存在,是否有权限这样做。当后台验证通过了。就上传一个临时的图片文件到项目中并且return出去。 flash得到这个返回值 判断临时图片是否上传成功了,如果成功,将图片显示出来并且可以用于截图使用,这样可以截取的图片就出来了。 下面的操作就是用户选择大小 选择截图的位置。点击确定。这个时候flash就第二次访问asp。net中的类【这是第二次的处理,将临时文件delete将用户截取的图片上传到正式的图片中去】 当asp。net中的类处理操作完成了return true。这样页面上传图片就算是成功了。

原理我明白以后 下面要做的就是将这些我需要的文件搞出来,不要的果断就抛下了

前台的js 我的项目中就可以直接的使用静态的了

写法是:

注意:ucapi=http://192.168.0.101/ajaxpage.aspx\" 这是一个参数 用处是:flash和哪一个asp.net的类联系。 这个参数必不可少,而且必须用绝对路径,不然是要报错的。

   var HeadPic="<%=HeadPic %>";//这是显示原来用户上传的图片的一个变量
   var ManID="<%=ManID%>"//这是用户的id
    jQuery(function(){ 
    jQuery("#ShowPic").html("<img src='"+HeadPic+"'/>");//显示用户当前头像
    if (BROWSER.ie){//判断浏览器是否是ie的
    jQuery("#pictd").html("<object name=\"mycamera\" width=\"540\" height=\"253\" id=\"mycamera\" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\"><PARAM NAME=\"_cx\" VALUE=\"14287\"><PARAM NAME=\"_cy\" VALUE=\"6693\"><PARAM NAME=\"FlashVars\" VALUE=\"\"><PARAM NAME=\"Movie\" VALUE=\" ../images/common/camera.swf?nt=1&amp;inajax=1&amp;appid=5d45677bdfb5e56996e632f1b04df21b&amp;input=QMPeW2gQeHU=&amp;MainID="+ManID+"&amp;ucapi=http://192.168.0.101/ajaxpage.aspx\"><PARAM NAME=\"Src\" VALUE=\" ../images/common/camera.swf?nt=1&amp;inajax=1&amp;appid=5d45677bdfb5e56996e632f1b04df21b&amp;input=QMPeW2gQeHU=&amp;MainID="+ManID+"&amp;ucapi=http://192.168.0.101/ajaxpage.aspx\"><PARAM NAME=\"WMode\" VALUE=\"Transparent\"><PARAM NAME=\"Play\" VALUE=\"0\"><PARAM NAME=\"Loop\" VALUE=\"-1\"><PARAM NAME=\"Quality\" VALUE=\"High\"><PARAM NAME=\"SAlign\" VALUE=\"\"><PARAM NAME=\"Menu\" VALUE=\"0\"><PARAM NAME=\"Base\" VALUE=\"\"><PARAM NAME=\"AllowScriptAccess\" VALUE=\"always\"><PARAM NAME=\"Scale\" VALUE=\"NoScale\"><PARAM NAME=\"DeviceFont\" VALUE=\"0\"><PARAM NAME=\"EmbedMovie\" VALUE=\"0\"><PARAM NAME=\"BGColor\" VALUE=\"FFFFFF\"><PARAM NAME=\"SWRemote\" VALUE=\"\"><PARAM NAME=\"MovieData\" VALUE=\"\"><PARAM NAME=\"SeamlessTabbing\" VALUE=\"1\"><PARAM NAME=\"Profile\" VALUE=\"0\"><PARAM NAME=\"ProfileAddress\" VALUE=\"\"><PARAM NAME=\"ProfilePort\" VALUE=\"0\"><PARAM NAME=\"AllowNetworking\" VALUE=\"all\"><PARAM NAME=\"AllowFullScreen\" VALUE=\"false\"></object>");
    }else{//不是ie的 使用下面的加载方法
    jQuery("#pictd").html("<embed height=\"253\" width=\"540\" type=\"application/x-shockwave-flash\" allowscriptaccess=\"always\" swliveconnect=\"true\" menu=\"false\" wmode=\"transparent\" bgcolor=\"#ffffff\" quality=\"high\" name=\"mycamera\" src=\"../images/common/camera.swf?nt=1&amp;inajax=1&amp;appid=2480130ef6144ee4ec7b8bb6ee818178&amp;input=7EyPXS2l2uo=&amp;MainID="+ManID+"&amp;ucapi=http://192.168.0.101/ajaxpage.aspx\" scale=\"exactfit\">")
    }
    });


通过上面的方法 如果js没错的话 应该在页面上看到:这样的效果。

下一步就对ajaxpage页面做修改。

原来的页面情况是:在flash中指定的是ajax.aspx页面 而ajax页面中将处理的内容是放到一个类中的,当然我们完全可以不用它这种方式 直接新建一个页面--》ajaxPage页面就行了。

页面代码和药修改的地方:

可以看到这个类少了很多 以前的东西,以为我们不必要处理那么多的事件,只是一个单纯的上传图片的处理而已。

主要要修改的地方:是上传图片的路径【一个是临时文件,第二个是保持的文件路径】。

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.Common;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml;
using System.IO;


using Discuz.Common;
using Discuz.Forum;
using Discuz.Entity;
using Discuz.Cache;
using Discuz.Config;
using Discuz.Plugin.Space;
using Discuz.Plugin.Album;
using Discuz.Plugin.Mall;
using Discuz.Common.Generic;
using Newtonsoft.Json;


public partial class ajaxPage : System.Web.UI.Page
{


    string uId = "";
    string corpId = "";
    GeneralConfigInfo config;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["UMID"] != null)//如果session中是有值的
        {
            corpId = Session["UMID"].ToString().Split('|')[0];//商家id
            uId = Session["UMID"].ToString().Split('|')[1];//用户id
        }
        //uid = DNTRequest.GetString("MainID");
        string type = DNTRequest.GetString("t");
        if (DNTRequest.GetString("Filename") != "" && DNTRequest.GetString("Upload") != "")
        {


            ResponseText(UploadTempAvatar(uId));
            return;
        }
        if (DNTRequest.GetString("avatar1") != "" && DNTRequest.GetString("avatar2") != "" && DNTRequest.GetString("avatar3") != "")
        {
            CreateDir(uId);
            if (!(SaveAvatar("avatar1", uId) && SaveAvatar("avatar2", uId) && SaveAvatar("avatar3", uId)))
            {
                File.Delete(Utils.GetMapPath("images\\temp\\avatar_" + uId + ".jpg"));
                ResponseText("<?xml version=\"1.0\" ?><root><face success=\"0\"/></root>");
                return;
            }
            File.Delete(Utils.GetMapPath("images\\temp\\avatar_" + uId + ".jpg"));
            ResponseText("<?xml version=\"1.0\" ?><root><face success=\"1\"/></root>");
            return;
        }
    }
    #region 头像
    /// <summary>
    /// 解码Uid
    /// </summary>
    /// <param name="encodeUid"></param>
    /// <returns></returns>
    private string DecodeUid(string encodeUid)
    {
        return "1";
    }


    /// <summary>
    /// 获取游客的所在地
    /// </summary>
    private void GetIpList()
    {
        try
        {
            string[] ipList = Utils.SplitString(DNTRequest.GetString("iplist"), ",");
            string[] pidList = Utils.SplitString(DNTRequest.GetString("pidlist"), ",");
            StringBuilder sb = new StringBuilder();
            sb.Append("[");
            for (int i = 0; i < ipList.Length; i++)
            {
                sb.Append("'");
                sb.Append(pidList[i]);
                sb.Append("|");
                sb.Append(IpSearch.GetAddressWithIP(ipList[i].Replace("*", "1")));
                sb.Append("'");
                sb.Append(",");
            }
            ResponseJSON(sb.ToString().TrimEnd(',') + "]");
        }
        catch //添加try语法, 以防止在并发情况下, 服务器端远程链接被关闭后出现应用程序 '警告'(事件查看器)
        {
            System.Web.HttpContext.Current.Response.Clear();
            System.Web.HttpContext.Current.Response.Expires = 0;
            System.Web.HttpContext.Current.Response.Cache.SetNoStore();
            System.Web.HttpContext.Current.Response.End();
        }
    }


    /// <summary>
    /// 创建文件夹
    /// </summary>
    /// <param name="uid"></param>
    private void CreateDir(string uid)
    {
        string avatarDir = string.Format("images/{0}",
          corpId);
        if (!Directory.Exists(Utils.GetMapPath(avatarDir)))
            Directory.CreateDirectory(Utils.GetMapPath(avatarDir));
    }


    /// <summary>
    /// 保存头像文件
    /// </summary>
    /// <param name="avatar"></param>
    /// <param name="uid"></param>
    /// <returns></returns>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值