2014年6月29日星期日

百度 flash html5自切换 多文件异步上传控件webuploader基本用法 - eflay

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
百度 flash html5自切换 多文件异步上传控件webuploader基本用法 - eflay  阅读原文»

双核浏览器下在chrome内核中使用uploadify总有302问题,也不知道如何修复,之所以喜欢360浏览器是因为帮客户控制渲染内核:

若页面需默认用极速核,增加标签:<meta name="renderer" content="webkit">
若页面需默认用ie兼容内核,增加标签:<meta name="renderer" content="ie-comp">
若页面需默认用ie标准内核,增加标签:<meta name="renderer" content="ie-stand">

要解决302问题也很简单,就是html5的文件上传,正好最近在ueditor里看到百度的webuploader,会自动选择flash html5,就是一个成熟的解决方案了。

先看前端,我们将最常用的操作封装为插件,asp.net中和MVC中最好使用相对于应用程序的绝对路径,自行定义全局applicationPath :var applicationPath = "@(Href("~")=="/"?"":Href("~"))";

前端代码:

(function ($, applicationPath) {
var applicationPath = applicationPath === "" ? "" : applicationPath || "../..";
function initWebUpload(item, options) {
var defaults = {
hiddenInputId: "uploadifyHiddenInputId", // input hidden id
onAllComplete: function (event) { }, // 当所有file都上传后执行的回调函数
onComplete: function (event) { },// 每上传一个file的回调函数
innerOptions: {},
fileNumLimit: undefined,
fileSizeLimit: undefined,
fileSingleSizeLimit: undefined
};

var opts = $.extend({}, defaults, options);

var target = $(item);
var pickerid = guidGenerator().replace(/-/g, "");
var uploaderStrdiv = '<div class="webuploader">' +
'<div id="thelist" class="uploader-list"></div>' +
'<div class="btns">' +
'<div id="' + pickerid + '">选择文件</div>' +
//'<a id="ctlBtn" class="btn btn-default">开始上传</a>' +
'</div>' +
'</div>';
target.append(uploaderStrdiv);

var $list = target.find('#thelist'),
$btn = target.find('#ctlBtn'),
state = 'pending',
uploader;

var jsonData = {
fileList: []
};

var webuploaderoptions = $.extend({

// swf文件路径
swf: applicationPath + '/Scripts/lib/webuploader/Uploader.swf',

// 文件接收服务端。
server: applicationPath + '/MvcPages/WebUploader/Process',

// 选择文件的按钮。可选。
// 内部根据当前运行是创建,可能是input元素,也可能是flash.
pick: '#' + pickerid,

// 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
resize: false,
fileNumLimit: opts.fileNumLimit,
fileSizeLimit: opts.fileSizeLimit,
fileSingleSizeLimit: opts.fileSingleSizeLimit
},
opts.innerOptions);
var uploader = WebUploader.create(webuploaderoptions);

uploader.on('fileQueued', function (file) {
var $list = $("#thelist");
$list.append('<div id="' + file.id + '" class="item">' +
'<div class="info">' + file.name + '</div>' +
'<div class="state">等待上传...</div>' +
'<div class="del"></div>' +
'</div>');
});
uploader.on('uploadProgress', function (file, percentage) {
var $li = $('#' + file.id),
$percent = $li.find('.progress .bar');

// 避免重复创建
if (!$percent.length) {
$percent = $('<span class="progress">' +
'<span class="percentage"><span class="text"></span>' +
'<span class="bar" role="progressbar" style="width: 0%">' +
'</span></span>' +
'</span>').appendTo($li).find('.bar');
}

$li.find('div.state').text('上传中');
//$li.find(".text").text(percentage * 100 + '%');
$percent.css('width', percentage * 100 + '%');
});
uploader.on('uploadSuccess', function (file, response) {
$('#' + file.id).find('div.state').text('已上传');
var fileEvent = {
queueId: file.id,
name: file.name,
size: file.size,
type: file.type,
filePath: response.filePath
};
jsonData.fileList.push(fileEvent)
opts.onComplete(fileEvent);

});

uploader.on('uploadError', function (file) {
$('#' + file.id).find('div.state').text('上传出错');
});

uploader.on('uploadComplete', function (file) {
$('#' + file.id).find('.progress').fadeOut();
var fp = $("#" + opts.hiddenInputId);
fp.val(JSON.stringify(jsonData));
opts.onAllComplete(jsonData.fileList);
});

uploader.on('fileQueued', function (file) {
uploader.upload();
});

uploader.on('filesQueued', function (file) {
uploader.upload();
});

uploader.on('all', function (type) {
if (type === 'startUpload') {
state = 'uploading';
} else if (type === 'stopUpload') {
state = 'paused';
} else if (type === 'uploadFinished') {
state = 'done';
}

if (state === 'uploading') {
$btn.text('暂停上传');
} else {
$btn.text('开始上传');
}
});

$btn.on('click', function () {
if (state === 'uploading') {
uploader.stop();
} else {
uploader.upload();
}
});
//删除
$list.on("click", ".del", function () {
var $ele = $(this);
var id = $ele.parent().attr("id");
var deletefile = {};
$.each(jsonData.fileList, function (index, item) {
if (item && item.queueId === id) {
deletefile = jsonData.fileList.splice(index, 1)[0];
$("#" + opts.hiddenInputId).val(JSON.stringify(jsonData));
$.post(/*自己发送处理删除指令*/, function (returndata) {
$ele.parent().remove();
});
return;
}
});
});

}


$.fn.powerWebUpload = function (options) {

var ele = this;
$.lazyload(applicationPath + "/Scripts/lib/webuploader/webuploader.css", function () { }, 'css');
$.lazyLoad(applicationPath + "/Scripts/lib/webuploader/webuploader.min.js", function () {
initWebUpload(ele, options);
});

}
})(jQuery, applicationPath);

  

MVC版后端文件接收,即便你是asp.net 引入mvc做ajax也是可以的:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace FormDesigner
{
public class WebUploaderController : BaseController
{
public ActionResult Process(string id, string name, string type, string lastModifiedDate, int size)
{
string filePathName = string.Empty;
string urlPath = "../../App_Upload/Document";
string localPath = Path.Combine(HttpRuntime.AppDomainAppPath, "App_Upload\\Document");
if (Request.Files.Count == 0)
{
return Json(new { jsonrpc = 2.0, error = new { code = 102, message = "保存失败" }, id = "id" });
}
try
{
filePathName = //自己在这里处理文件保存
}
catch (Exception)
{
return Json(new { jsonrpc = 2.0, error = new { code = 103, message = "保存失败" }, id = "id" });
}

return Json(new
{
jsonrpc = "2.0",
id = "id",
filePath = urlPath + "/" + filePathName
});
}
}
}

  

页面后台就自己处理hiddenfiled的内容了。


本文链接:百度 flash html5自切换 多文件异步上传控件webuploader基本用法,转载请注明。

SQL扫描并执行文件夹里的sql脚本 - 一杯晨光  阅读原文»

场景:项目数据库操作全部使用存储过程实现。每天都会有很多存储过程更新/增加,测试环境中存储过程更新遗漏有一定概率,也教麻烦!所以,需要一个工具将文件夹中所有存储过程执行一次。
当然,用c#写一个也很简单,而且功能强大。但是,我想尝试一下使用sql实现同样的功能,然后就发现了xp_cmdshell这个强大而又危险的东西!我实现的还只是扫面一个文件夹里的存储过程,这样如果存储过程被分放到几个文件夹,就需要执行几次,很不方便。如果有大神知道,怎么扫描子文件夹里的存储过程,请赐教!嘿嘿!平时比较懒,很多东西想记录下来,却没有去做,只能写下这样比较省时间的啦!USE [xxxxx]
GO
IF OBJECTPROPERTY(OBJECT_ID(N'ExecDirPro'), N'IsProcedure') = 1
DROP PROCEDURE dbo.ExecDirPro
GO
--------------------------------------------------------------------------------------------
-- Name:ExecDirPro
-- Purpose:传入目录,执行目录下所有sql脚本。
-- Location:Lottery
-- Excecution Example:EXEC dbo.ExecDirPro
-- Authorized to:
--
-- Author:
-- Create date:2014-6-26
-- Alter:
--------------------------------------------------------------------------------------------
CREATE PROCEDURE [dbo].[ExecDirPro]
@dirPath nvarchar(200)--注意路劲请以“\”结束,有中文时,前面加N。
AS
begin try
--开启xp_cmdshell,完成以后关闭。保持开启很危险
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
CREATE TABLE #T([filename] nvarchar(1024));

declare @path nvarchar(300)
set @path='dir '+@dirPath+' *.sql /b'

INSERT #T EXEC xp_cmdshell @path

DELETE #T WHERE [filename] IS NULL;

DECLARE @FILENAME NVARCHAR(1024);

DECLARE cur CURSOR FOR SELECT [filename] FROM #T;

OPEN cur;

DECLARE @sql NVARCHAR(1000);
FETCH NEXT FROM cur INTO @FILENAME;

WHILE @@FETCH_STATUS=0
BEGIN
SET @sql=N'sqlcmd -E -i '+@dirPath+@FILENAME;
EXEC xp_cmdshell @sql;
FETCH NEXT FROM cur INTO @FILENAME;
END
CLOSE cur;
DEALLOCATE cur;
--关闭xp_cmdshell
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;
end try
BEGIN CATCH
--关闭xp_cmdshell
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;
SELECT ERROR_NUMBER() AS ErrorNumber;
END CATCH;
GO利用xp_cmdshell扩展,调用执行系统shell脚本。没错,开启xp_cmdshell之后,可以执行shell脚本,可以干很多坏事!嘿嘿!如果你的数据库权限被人拿到,并且有开启xp_cmdshell的权限,这是极其危险的!xp_cmdshell一直开着不关,更是要不得的!请一定记住,完毕以后关闭xp_cmdshell!

  


本文链接:SQL扫描并执行文件夹里的sql脚本,转载请注明。

阅读更多内容

没有评论:

发表评论