文件上传功能
⑴ JAVA WEB文件上传步骤
JAVA WEB文件上传步骤如下:
实现 Web 开发中的文件上传功能,两个操作:在 Web 页面添加上传输入项,在 Servlet 中读取上传文件的数据并保存在本地硬盘中。
1、Web 端上传文件。在 Web 页面中添加上传输入项:<input type="file"> 设置文件上传输入项时应注意:(1) 必须设置 input 输入项的 name 属性,否则浏览器将不会发送上传文件的数据。(2) 必须把 form 的 enctype 属性设为 multipart/form-data,设置该值后,浏览器在上传文件时,将把文件数据附带在 http 请求消息体中,并使用 MIME 协议对上传文件进行描述,以方便接收方对上传数据进行解析和处理。(3) 表单提交的方式要是 post
2、服务器端获取文件。如果提交表单的类型为 multipart/form-data 时,就不能采用传统方式获取数据。因为当表单类型为 multipart/form-data 时,浏览器会将数据以 MIME 协议的形式进行描述。如果想在服务器端获取数据,那么我们必须采用获取请求消息输入流的方式来获取数据。
3、Apache-Commons-fileupload。为了方便用户处理上传数据,Apache 提供了一个用来处理表单文件上传的开源组建。使用 Commons-fileupload 需要 Commons-io 包的支持。
4、fileuplpad 组建工作流程
(1)客户端将数据封装在 request 对象中。
(2)服务器端获取到 request 对象。
(3)创建解析器工厂 DiskFileItemFactory 。
(4)创建解析器,将解析器工厂放入解析器构造函数中。之后解析器会对 request 进行解析。
(5)解析器会将每个表单项封装为各自对应的 FileItem。
(6)判断代表每个表单项的 FileItem 是否为普通表单项 isFormField,返回 true 为普通表单项。
(7)如果是普通表单项,通过 getFieldName 获取表单项名,getString 获得表单项值。
(8)如果 isFormField 返回 false 那么是用户要上传的数据,可以通过 getInputStream 获取上传文件的数据。通过getName 可以获取上传的文件名。
⑵ 在flash中如何实现文件上传功能
你问的问题,也是我找了很久的问题.局我自己所知,FLASH现在还没有这个功能吧,FLASH里面没有这个可能浏览自己本地的磁盘文件的组件.想要实现上传也只能自己来写出要上传文件的路径,再把这个路径连接发送能ASP文件或php,用它们来实现上传的后台工作~~``
(这是我自己所知道的,如果兄弟你要是知道怎么实现你自己所说的问题的答案的话,那麻烦你能不能也告诉我一下,谢谢)
⑶ 网站网页里怎样添加上传功能
楼主不妨去卓天网络和万网看下,还是找大服务商好些,只是万网有点贵,我楼上的人可能被亿佰数据骗了,亿佰数据只不过是代理的卓天网络的产品,才做不到一年还不够成熟,以后用的过程中出现什么问题,买前会很耐后的回答你,买后就不理你了,不信可以拿几百块钱去试试,亿佰数据所谓的自助建站还不错,几百个模板任选,界面很清新,同时支持简体中文版、繁体中文版、英文版三种语言网站,功能也很强,带产品发布系统、新闻系统、会员系统、投票系统、广告系统、招聘系统等动态功能模块,页面随意增加。运用功能强大的管理平台,轻点鼠标就能立即制作精美的网站,非常适合中小企业建站等,都是在卓天网络以低价代理来的,不信在网络输一下亿佰数据和卓天网络就真相大白了,我是上当来着的,不小心看到了也提醒一下楼主。
⑷ 如何设计出一个安全的文件上传功能
这两天我们的老朋友PDP在BlackHat 08上做了一个关于GIFAR的演讲。和往常一样,PDP的东西基本上都很猥琐,这个也是。主题是关于是如何把GIF或者 JPG文件和JAR文件捆绑在一起,然后欺骗服务器以为是GIF或JPG文件,结果却是在客户端的JVM中执行JAR的例子。
他还举了些欺骗的例子,比如在office2007中,doc文件实际上就是zip格式了,里面都是些xml,那么他把jar文件打包在zip文件里,再把后缀改成doc,来达到欺骗的目的。
在这里是客户端的问题,我想到的则是其他的问题,比如安全上传。
根据以往的经验看来,我们可能会设计如下文件上传的安全规则:
1. 文件上传的目录设置为不可执行
2. 判断文件类型
3. 单独设置文件服务器的域名
4. 改写文件名,文件路径不可预测
第一点规则是显而易见的,是为了减小执行动态语言脚本的风险。如果被成功上传了一个webshell,但是不能执行,还是能够起到深度防御的作用。
第二点,在判断文件类型的时候,我们一般要求使用白名单,而不是黑名单,因为黑名单可能会列不全,还可能会造成一些bypass的风险。
比如以前老版本的 FCKEditor就出过这种问题,只做了黑名单的控制,最后被bypass。
而apache有个特性,是解析第一个“ . ”后的文件后缀作为文件类型,比如 fvck.php.rar.rar.rar 会被apache当作 fvck.php解析。 我最近看了下php的手册,在安装文档里,针对这个问题,专门有一个指导:
15. Tell Apache to parse certain extensions as PHP. For example, lets have
Apache parse .php files as PHP. Instead of only using the Apache AddType
directive, we want to avoid potentially dangerous uploads and created
files such as exploit.php.jpg from being executed as PHP. Using this
example, you could have any extension(s) parse as PHP by simply adding
them. Well add .phtml to demonstrate.
<FilesMatch .php$>
SetHandler application/x-httpd-php
</FilesMatch>
IIS6也有这种类似的特性,即在文件夹名字为 fvck.asp 时(fvck可替换为任意值),该文件夹下任何文件都会被当作asp来执行,
至今似乎也未见到微软有把这个特性当作bug来fix的迹象。
所以如果不熟悉这些webserver的特性,你可能会觉得漏洞来的如此神奇:我明明做了充分限制,为什么还是被“做俯卧撑”了?
在判断文件类型的时候,大多数程序都是使用的采用检查文件后缀的方法,这里主要需要注意的hacking trick是某些检查函数是否会以0字节作为结束的判断,以前动网就出过类似的漏洞,上传 fvck.jpg%00.asp即可绕过文件类型检查。
我也见过只检查文件头部的,这种也很好欺骗,构造一个合法的gif文件头部,然后将webshell贴在后面,在后缀合法的情况下,一样能够被浏览器解析:
GIF89a ?
<? phpinfo(); ?>
比较高级一点的是做更多的文件格式检查,比如检查图片里像素的长宽等,然后再对图片做一次压缩,这样出来的图片基本都变形了,有啥webshell也被破坏了。
而检查文件格式时候一般会用到一些网上已经封装好的类,在扫描文件格式方面还是比较有优势的。但是在检查大文件的时候效率显然是一个需要考虑的问题,很多程序员出于效率原因可能不太会愿意选择这种方式。
但是今天从PDP的这个绑定文件的猥琐方法看来,详细检查文件格式的方法还是非常有必要的,因为攻击者的目标可能不光是服务器,还是客户端,如果要对客户端有所保证,就必须要详细检查文件格式,使之落在白名单中。
第三点,单独设置文件服务器域名,也是一种针对客户端的保护。这样可能会避免许多跨域的问题。如果发生了XSS,攻击者可能还需要突破跨域的限制才能进一步扩大战果。再比如如果被上传了crossdomain.xml,可能就会导致flash的跨域问题,这些都是实实在在的风险。
第四点,改写文件名,随机文件路径。这是把风险藏起来,现在基本上尽职一点的程序员都会这么设计,这也是最大程度减小风险的非常切实有效的手段。
需要注意的是构造随机文件名或路径的算法需要足够“随机”,而不要从比如cookie之类的地方直接取一段hash出来。比较好的做法是在server上用类似random()一类的函数来生成,相信程序员们这点意识还是有的,不再赘述了。
⑸ 如何实现点击Button实现上传文件的功能
如何实现点击Button实现上传文件的功能
可以试下:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>定义input type="file" 的样式</title>
<style type="text/css">
body{ font-size:14px;}
input{ vertical-align:middle; margin:0; padding:0}
.file-box{ position:relative;width:340px}
.txt{ height:22px; border:1px solid #cdcdcd; width:180px;}
.btn{ background-color:#FFF; border:1px solid #CDCDCD;height:24px; width:70px;}
.file{ position:absolute; top:0; right:80px; height:24px; filter:alpha(opacity:0);opacity: 0;width:260px }
</style>
</head>
<body>
<div class="file-box">
<form action="" method="post" enctype="multipart/form-data">
<input type='text' name='textfield' id='textfield' class='txt' />
<input type='button' class='btn' value='浏览...' />
<input type="file" name="fileField" class="file" id="fileField" size="28" onchange="document.getElementById('textfield').value=this.value" />
<input type="submit" name="submit" class="btn" value="上传" />
</form>
</div>
</body>
</html>
⑹ 如何实现在网站的文件上传和下载功能
呵呵, ASP的到JAVA来问啦.
-------给你引用一段。
文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括:
1、如何解决文件上传大小的限制
2、以文件形式保存到服务器
3、转换成二进制字节流保存到数据库以及下载方法
4、上传Internet上的资源
第一部分:
首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文件来自定义最大文件大小,如下:
<httpRuntime executionTimeout="300" maxRequestLength="40960" useFullyQualifiedRedirectUrl="false"/>这样上传文件的最大值就变成了4M,但这样并不能让我们无限的扩大MaxRequestLength的值,因为ASP.NET会将全部文件载入内存后,再加以处理。解决的方法是利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody和ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据。实现方法如下:
IServiceProviderprovider=(IServiceProvider)HttpContext.Current;
HttpWorkerRequestwr=(HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
byte[]bs=wr.GetPreloadedEntityBody();
.
if(!wr.IsEntireEntityBodyIsPreloaded())
{
intn=1024;
byte[]bs2=newbyte[n];
while(wr.ReadEntityBody(bs2,n)>0)
{
..
}
}这样就可以解决了大文件的上传问题了。
第二部分:
下面我们来介绍如何以文件形式将客户端的一个文件上传到服务器并返回上传文件的一些基本信息
首先我们定义一个类,用来存储上传的文件的信息(返回时需要)。
public class FileUpLoad
{
public FileUpLoad()
{
}
/**//// <summary>
/// 上传文件名称
/// </summary>
public string FileName
{
get
{
return fileName;
}
set
{
fileName = value;
}
}
private string fileName;
/**//// <summary>
/// 上传文件路径
/// </summary>
public string FilePath
{
get
{
return filepath;
}
set
{
filepath = value;
}
}
private string filepath;
/**//// <summary>
/// 文件扩展名
/// </summary>
public string FileExtension
{
get
{
return fileExtension;
}
set
{
fileExtension = value;
}
}
private string fileExtension;
}
另外我们还可以在配置文件中限制上传文件的格式(App.Config):
<?xml version="1.0" encoding="gb2312" ?>
<Application>
<FileUpLoad>
<Format>.jpg|.gif|.png|.bmp</Format>
</FileUpLoad>
</Application>
这样我们就可以开始写我们的上传文件的方法了,如下:
public FileUpLoad UpLoadFile(HtmlInputFile InputFile,string filePath,string myfileName,bool isRandom)
{
FileUpLoad fp = new FileUpLoad();
string fileName,fileExtension;
string saveName;
//
//建立上传对象
//
HttpPostedFile postedFile = InputFile.PostedFile;
fileName = System.IO.Path.GetFileName(postedFile.FileName);
fileExtension = System.IO.Path.GetExtension(fileName);
//
//根据类型确定文件格式
//
AppConfig app = new AppConfig();
string format = app.GetPath("FileUpLoad/Format");
//
//如果格式都不符合则返回
//
if(format.IndexOf(fileExtension)==-1)
{
throw new ApplicationException("上传数据格式不合法");
}
//
//根据日期和随机数生成随机的文件名
//
if(myfileName != string.Empty)
{
fileName = myfileName;
}
if(isRandom)
{
Random objRand = new Random();
System.DateTime date = DateTime.Now;
//生成随机文件名
saveName = date.Year.ToString() + date.Month.ToString() + date.Day.ToString() + date.Hour.ToString() + date.Minute.ToString()
+ date.Second.ToString() + Convert.ToString(objRand.Next(99)*97 + 100);
fileName = saveName + fileExtension;
}
string phyPath = HttpContext.Current.Request.MapPath(filePath);
//判断路径是否存在,若不存在则创建路径
DirectoryInfo upDir = new DirectoryInfo(phyPath);
if(!upDir.Exists)
{
upDir.Create();
}
//
//保存文件
//
try
{
postedFile.SaveAs(phyPath + fileName);
fp.FilePath = filePath + fileName;
fp.FileExtension = fileExtension;
fp.FileName = fileName;
}
catch
{
throw new ApplicationException("上传失败!");
}
//返回上传文件的信息
return fp;
}
然后我们在上传文件的时候就可以调用这个方法了,将返回的文件信息保存到数据库中,至于下载,就直接打开那个路径就OK了。
第三部分:
这里我们主要说一下如何以二进制的形式上传文件以及下载。首先说上传,方法如下:
public byte[] UpLoadFile(HtmlInputFile f_IFile)
{
//获取由客户端指定的上传文件的访问
HttpPostedFile upFile=f_IFile.PostedFile;
//得到上传文件的长度
int upFileLength=upFile.ContentLength;
//得到上传文件的客户端MIME类型
string contentType = upFile.ContentType;
byte[] FileArray=new Byte[upFileLength];
Stream fileStream=upFile.InputStream;
fileStream.Read(FileArray,0,upFileLength);
return FileArray;
}
这个方法返回的就是上传的文件的二进制字节流,这样我们就可以将它保存到数据库了。下面说一下这种形式的下载,也许你会想到这种方式的下载就是新建一个aspx页面,然后在它的Page_Load()事件里取出二进制字节流,然后再读出来就可以了,其实这种方法是不可取的,在实际的运用中也许会出现无法打开某站点的错误,我一般采用下面的方法:
首先,在Web.config中加入:
<add verb="*" path="openfile.aspx" type="RuixinOA.Web.BaseClass.OpenFile, RuixinOA.Web"/>
这表示我打开openfile.aspx这个页面时,系统就会自动转到执行RuixinOA.Web.BaseClass.OpenFile 这个类里的方法,具体实现如下:
using System;
using System.Data;
using System.Web;
using System.IO;
using Ruixin.WorkFlowDB;
using RXSuite.Base;
using RXSuite.Component;
using RuixinOA.BusinessFacade;
namespace RuixinOA.Web.BaseClass
{
/**//// <summary>
/// NetUFile 的摘要说明。
/// </summary>
public class OpenFile : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
//从数据库中取出要下载的文件信息
RuixinOA.BusinessFacade.RX_OA_FileManager os = new RX_OA_FileManager();
EntityData data = os.GetFileDetail(id);
if(data != null && data.Tables["RX_OA_File"].Rows.Count > 0)
{
DataRow dr = (DataRow)data.Tables["RX_OA_File"].Rows[0];
context.Response.Buffer = true;
context.Response.Clear();
context.Response.ContentType = dr["CContentType"].ToString();
context.Response.AddHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(dr["CTitle"].ToString()));
context.Response.BinaryWrite((Byte[])dr["CContent"]);
context.Response.Flush();
context.Response.End();
}
}
public bool IsReusable
{
get { return true;}
}
}
}
执行上面的方法后,系统会提示用户选择直接打开还是下载。这一部分我们就说到这里。
第四部分:
这一部分主要说如何上传一个Internet上的资源到服务器。前面我们有一篇文章详细介绍了使用方法,这里我不再多说。
请参考:将动态页面转化成二进制字节流
第五部分:总结
今天简单的介绍了几种文件上传与下载的方法,都是在实际的项目开发中经常需要用到的,可能还有不完善的地方,希望大家可以互相交流一下项目开发中的经验。写的不好的地方,请指正,谢谢!
⑺ access 如何做上传文件的功能
1、利用FileDialog对象的文件拾取器获取客户端文件路径(并同时获取文件名),并实现多选。
2、用FileCopy方法,把客户端图片复制到后台数据库文件夹。
3、用ADO记录集,把存放在后台数据库的图片路径字符串追加到数据表中。
4、通过设置窗体或者报表中图片路径的方法在窗体或者报表中显示图片。
http://www.office-cn.net/forum.php?mod=viewthread&tid=83567 请参考这个示例
⑻ 360浏览器中无法使用文件上传功能
1、首先打开360浏览器,点击选择右上角“三”图标按钮。
⑼ VB中如何实现上传文件的功能
用script脚本 直接调用ftp 命令实现上传文件到FTP服务器。
代码如下:
'定义API函数
ConstSYNCHRONIZE=&H100000
ConstINFINITE=&HFFFFFFFF
"kernel32"(ByValdwDesiredAccessAsLong,ByValbInheritHandleAsLong,ByValdwProcessIdAsLong)AsLong
"kernel32"(ByValhObjectAsLong)AsLong
"kernel32"(ByValhHandleAsLong,ByValdwMillisecondsAsLong)AsLong
PrivateSubCommand1_Click()
DimfilenameAsString
DimftpAsString
DimunameAsString
DimupinAsString
ftp=InputBox("请输入服务器地址")
uname=InputBox("请输入帐号",,"anonymous")
upin=InputBox("请输入密码",,"IE@User")
filename=Timer()'取时间为文件名filename
Openfilename&".script"ForOutputAs#1'生成filename.script脚本,传输FTP用
Print#1,"user"
Print#1,uname
Print#1,upin
Print#1,"pwd"
Print#1,"hash"
Print#1,"put"&filename&".txt"
Print#1,"quit"
Close#1
Openfilename&".txt"ForOutputAs#1'生成的filename.txt保存了combo1和text1的文字
Print#1,Text1.Text
Print#1,Combo1.Text
Close#1
DoEvents
'调用ftp命令传输,不需要inet或winsock控件
DimpIdAsLong,pHndAsLong
pId=Shell("ftp-n-s:"&filename&".script"&""&ftp,vbHide)
pHnd=OpenProcess(SYNCHRONIZE,0,pId)
IfpHnd<>0Then
CallWaitForSingleObject(pHnd,INFINITE)
CallCloseHandle(pHnd)
EndIf
Killfilename&".script"'因为script脚本保存了帐号和密码,当传输完成后删除filename.script脚本
EndSub