SWFUpload插件+FTP文件上传,我这么玩

效果图:

虽然之前接触过swfupload这个上传插件,但是之前做的样子是这样的

实战项目做的这么丑爆了我估计老大的内心是会崩溃的,所以特地在网上找了美观一点的样式,原帖地址:http://www.xiariboke.com/article/200.html

原帖后台是基于php写的插件,虽然各位看官也许没学过php但是也应该见过php跑,后台改成c#代码就可以了。

前台页面是一样的,在引入一堆js文件之后,改动一下对js文件的引用路径即可,比如这样:

由于原版直接使用页面会有乱码

我也懒得测试是哪个js文件的编码不支持中文所以对js文件一律加上了 chartset="gb2312"的属性,显示问题解决。

来看看js中的配置,改动如下:

upload_url:请求上传的地址。请求自己写的aspx或者ashx或者MVC的controller

file_size_limit:上传文件限制大小。当然这只是插件初步对文件大小的检测,为防止大请求报文攻击,iis已经默认对文件上传做了限制,具体的数据我忘记了,测试是在5M以内,因此并不是在这里写多少就能上传多少,具体实现修改文件上传大小见下文

file_types:上传文件类型的检查。

下面的file_upload_limit也可以自行配置,用于配置上传文件个数

后台代码,根据项目加入了上传FTP及插入数据库:

        /// <summary>
        /// 文件上传
        /// </summary>
        /// <returns></returns>
        public ActionResult FileUpload()
        {
            HttpPostedFileBase file = Request.Files["Filedata"];
            string fileName = Path.GetFileName(file.FileName);
            string fileExt = Path.GetExtension(fileName);int fileSize = file.ContentLength;
            string msg = string.Empty;
            if (fileExt == ".jpg" || fileExt == ".gif" || fileExt == ".flv" || fileExt == ".mp4")
            {
                //从数据库获取FTP地址
                string serverIP = NVP_FTPServerService.LoadData("DepartmentID", LoginUser.DepartmentID.ToString()).FirstOrDefault().FTPServer;
                string userName = System.Configuration.ConfigurationManager.AppSettings["FTPUserName"];
                string password = System.Configuration.ConfigurationManager.AppSettings["FTPPassword"];
                string dir = "/UploadFile/" + DateTime.Now.ToString() + "/" + fileName;
                string localPath = Request.MapPath(dir);
                Directory.CreateDirectory(Path.GetDirectoryName(localPath));
                file.SaveAs(localPath);
                //上传Ftp
                FtpStatusCode ftpCode = FtpUpload(localPath, null, serverIP, userName, password);
                //删除原文件
                System.IO.File.Delete(localPath);
                if (ftpCode == FtpStatusCode.ClosingData)
                {
                    //录入数据库
                    int count = SaveDataInfo(fileSize, fileName);
                    if (count > 0)
                    {
                        msg = "上传成功";
                    }
                    else
                    {
                        msg = "数据库错误,上传文件信息无法显示";
                    }
                }
                else
                {
                    msg = "FTP服务器错误";
                }
            }
            else
            {
                msg = "上传文件类型错误";
            }
            return Content(msg);
        }

FTP上传部分

 private FtpStatusCode FtpUpload(string sFileDstPath, string FolderName, string ftpServerIP, string ftpUserName, string ftpPwd)
        {
            try
            {
                FileInfo fileInf = new FileInfo(sFileDstPath);
                FtpWebRequest reqFTP;
                FtpWebResponse uploadResponse = null;
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpServerIP + "/" + FolderName + "/" + fileInf.Name));
                reqFTP.Credentials = new NetworkCredential(ftpUserName, ftpPwd);
                reqFTP.KeepAlive = false;
                reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
                reqFTP.UseBinary = true;
                reqFTP.ContentLength = fileInf.Length;
                int buffLength = 2048;
                byte[] buff = new byte[buffLength];
                int contentLen;
                using (FileStream fs = fileInf.OpenRead())
                {
                    using (Stream strm = reqFTP.GetRequestStream())
                    {
                        contentLen = fs.Read(buff, 0, buffLength);
                        while (contentLen != 0)
                        {
                            strm.Write(buff, 0, contentLen);
                            contentLen = fs.Read(buff, 0, buffLength);
                        }
                    }
                }
                uploadResponse = (FtpWebResponse)reqFTP.GetResponse();
                return uploadResponse.StatusCode;
            }
            catch (Exception e)
            {
                return FtpStatusCode.Undefined;
                throw new Exception("Ftp错误", e);
            }
        }

ok,基本的配置就已经完成,但是由于前文说的iis对上传做了限制,所以我们还需要对此进行解除操作。

1.在Web.config文件中添加httpRuntime节点

<httpRuntime targetFramework="4.5" maxRequestLength="1073741824" executionTimeout="3600" appRequestQueueLimit="100" />

maxRequestLength决定了你要上传文件的最大长度,单位是kb,我随便写了个很大的数。后面两个一个是超时时间和最大请求队列,根据情况自定义设置。

2.部署项目后,在iis管理器里

请求筛选-编辑功能设置

最大内容长度里面填写在Web.config里面设置的最大长度

以上,所谓的大文件上传功能就基本实现了,你以为完事了?最好玩的才开始。

举个例子,实际项目在上传我们可能要显示上传失败的原因,比如上面的数据库错误,FTP错误等其它问题,因此要修改SWFupload的handler中的js事件,js配置部分:

我修改了file_dialog_complete_handler事件,改成了自己写的fileDialogComplete1,比如要在上传前添加些必填信息才可以执行上传,在【选择上传文件弹窗关闭事件】之后确定验证信息是否填写完毕再执行上传。

    function fileDialogComplete1(numFilesSelected, numFilesQueued) {
        try {
            var info = $(‘#info‘).val();
            if (numFilesQueued > 0) {
                if (info == "") {
                    alert("信息不能为空");
                    swfu.cancelUpload();
                    return;
                }
                //在上传文件中加入自定义参数,用于后台接收处理
                var postParams = {
                    ‘info‘: info
                };
                swfu.setPostParams(postParams);
                if (numFilesSelected > 0) {
                    document.getElementById(this.customSettings.cancelButtonId).disabled = false;
                }
                swfu.startUpload();
            }
        } catch (ex) {
            this.debug(ex);
        }
    }

实际上SWFupload可以玩的事件有很多,在handler.js文件中可以看到,如果需要控制某个事件可以直接修改,具体可见这篇文章:

SWFUpload 2.5.0版 官方说明文档 http://www.cnblogs.com/youring2/archive/2012/07/13/2590010.html

时间: 2024-11-16 03:20:14

SWFUpload插件+FTP文件上传,我这么玩的相关文章

MVC文件图片ajax上传轻量级解决方案,使用客户端JSAjaxFileUploader插件02-多文件上传

上一篇中,使用客户端jJSAjaxFileUploader插件实现单文件异步上传,本篇实现多文件异步上传. 本篇源码在github,先看效果: ● 上传文件显示进度条. ● 停止上传按钮和关闭缩略图按钮. ● 限制上传文件的类型. ● 限制上传文件的尺寸. ●同时上传多个文件成功后显示缩略图.文件名: ● 点击界面上的删除按钮,界面删除,同步删除文件夹中文件. ● 再点击上传文件,界面追加一行新的缩略图.文件名.删除按钮: □ HomeController 把上传的文件名改成以GUID命名的格式

FTP文件上传与下载

实现FTP文件上传与下载可以通过以下两种种方式实现,分别为:1.通过JDK自带的API实现:2.通过Apache提供的API是实现. 第一种方式 [java] view plaincopy package com.cloudpower.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import sun.n

jquery的uploadify插件多文件上传配置参数详解

最近做了个多文件上传,需要限制上传文件类型的例子.以前没做过找了一些资料,下次有用.同时也给大家做参考. uploader: uploadify.swf 文件的相对路径,该swf文件是一个带有文字BROWSE的按钮,点击后淡出打开文件对话框,默认值:uploadify.swf. script: 后台处理程序的相对路径 .默认值:uploadify.php checkScript:用来判断上传选择的文 件在服务器是否存在的后台处理程序的相对路径 fileDataName:设置一个名字,在服务器处理

Quartz石英调度实现ftp文件上传

Quartz石英调度实现ftp文件上传 实现一个每月1号00点01分自动生成的文件,通过ftp传到另一台主机上 1.先创建一个job任务类FtpUploadFileJobTask import java.io.ByteArrayInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import org.apache.commons.net

Java使用comms-net jar包完成ftp文件上传进度的检测功能

本文章只讲述大致的思路与本次功能对应的一些开发环境,具体实现请结合自己的开发情况,仅供参考,如果有不对的地方,欢迎大家指出! 准备环境:JDK1.7 OR 1.8.eclipse.ftp服务器(可自行搭建).comms-net jar包3.3版本的.其余的就不详细列举了. 1.在现实开发中ftp服务器和项目的部署服务器基本不会是同一台,所以基础springmvc的文件上传进度获取,只能获取到文件的二进制流到达项目后台的进度.对于真实的ftp文件上传进度,需要使用comms-net提供的监听器来实

【问题分析】FTP文件上传与下载

问题描述:通常应用服务器与文件服务器分别在不同的机器上,涉及到文件的上传与下载.通过建立网络映射盘的形式,将文件服务器保存文件的文件夹映射到应用服务器的某个盘符下,经过试验,在tomcat下两台笔记本是可以实现的,但是在生产环境的websphere下试验,经过多番尝试,仍然实现不了. 问题分析:采用FTP的方式实现文件的上传与下载功能,在Java代码中编写客户端的上传与下载,在文件服务器上,直接装一个FTP服务器软件即可.注意生产环境的防火墙以及客户是否允许使用FTP. 解决方案: 工程中导入J

Java实现FTP文件上传与下载

实现FTP文件上传与下载可以通过以下两种种方式实现(不知道还有没有其他方式),分别为:1.通过JDK自带的API实现:2.通过Apache提供的API是实现. 第一种方式 package com.cloudpower.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import sun.net.Telnet

FTP文件上传下载及验证

FTP文件上传下载及验证 有时候经常用到FTP的上传下载,本身代码相对比较简单,但有时需要考虑到文件上传下载进行验证.大体思路是上传时将FTP日志重定向到本地文件,再根据FTP返回码进行检查,这样有个缺点就是不能检验文件上传的完整性:下载时利用ls,ll命令查看是否存在. 上传代码 uploadFile() { ftp -i -v -n <<! >/tmp/ftp.log open $FTP_IP $FTP_PORT user $USER_ID $PASSWORD prompt cd $

【FTP】FTP文件上传下载-支持断点续传

Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常用)]和[ASCII_FILE_TYPE]两种; 数据连接模式:一般使用LocalPassiveMode模式,因为大部分客户端都在防火墙后面: 1. LocalPassiveMode:服务器端打开数据端口,进行数据传输: 2. LocalActiveMode:客户端打开数据端口,进行数据传输: 系统