linux 是服务器,用来24开机提供服务。
apache是引擎,用来提供别人访问你的网址能有东西出来。
ftp用来把你写的代码上传到linux上面去,有了这一步你的东西才能在服务器上被别人访问到。
只要远程目录上有你的东西就是上传成功了,端口默认是21
或者你可以上网买一些虚拟主机,有二级域名可以穿透,也可以外网访问
第一种:经典的form和input上传。
设置form的aciton为后端页面,enctype="multipart/form-data",type=‘post’
<form action='http://www.ty2y.com/' enctype="multipart/form-data" type='post'><input type='file'><input type='hidden' name='userid'><input type='hidden' name='signature'><button>提交</button></form>使用input选择文件,设置好其他input的值,点击提交,将文件数据及签名等认证信息发送到form设置的action对应的页面,浏览器也会跳转到该页面。触发form表单提交数据的方式有2种,一种是在页面上点击button按钮或<input
type='submit'>按钮触发,第二种是在js中执行form.submit()方法。
优点:使用简单方便,兼容性好,基本所有浏览器都支持。
缺点:1. 提交数据后页面会跳转(下面会讲如何禁止页面跳转)。
2.因为是浏览器发起的请求,不是一个ajax,所以前端无法知道什么时候上传结束。
3. form表单里发送除文件外的数据,一般是新建一个type=hidden的input,value=‘需要传的数据’,每发送一个数据就需要一个input,一旦多了就会使得dom看起来比较冗余。
小技巧:
form表单提交数据后会自动跳转到action指定的页面,为了禁止页面跳转,可以在页面中新建一个空的ifame,比如name='upload',然后设置form的target="Uploader",form有一个target的属性,规定在何处打开action,这样form提交数据后就会仍停留在当前页。代码如下:
<form action='http://www.jshaman.com/' enctype="multipart/form-data" type='post' target="uploader1"><input type='file'><button>提交</button></form><ifrmae name='upload' id='uploader1'></iframe>这样写的另一个好处是,可以知道什么时候上传完成并接收到后端的回调结果。比如上面这个例子,文件数据发送到了
'uploadFile.php',假设该页面处理完数据后返回了一个地址,该地址会被写入到之前的iframe中。所以在ifame的onload函数触发时,也就是上传完成后,可以在iframe中读取到后端返回的数据。
var iframe = document.getElementById('upload1')iframe.onload = function () {
var doc = window.frames['uploader1'].document var pre = doc.getElementsByTagName('pre') var obj = JSON.parse(pre[0].innerHTML)
}
使用这种方法时需要注意,iframe有跨域限制,创建出来的iframe的地址如果和当前页面地址不同源,会报错。这种情况下,建议大家在iframe的onload函数中,再次向后端请求一个接口获取文件地址,而不是直接去iframe里读取。或者返回这样的数据。
<script type="text/javascript">window.top.window[callback](data)</script>callback是和前端约定好的名字,上传完成后触发该函数并返回后端数据。
第二种:使用formData上传。
用js构造form表单的数据,简单高效,但最低只兼容IE10,所以需要兼容IE9的童鞋们就略过这个方法吧。
html:
<input type='file'>js:
var formData = new FormData()formData.append("userid", userid)
formData.append("signature", signature)
formData.append("file", file) //file是blob数据//再用ajax发送formData到服务器即可,
注意一定要是post方式上传
说明:第一种方法提到了创建多个type=‘hidden’的input来发送签名数据,这儿可以用formData.append方法来代替该操作,避免了dom中有多个input的情况出现。最后将file数据也append到formData发送到服务器即可完成上传。
优点:由于这种方式是ajax上传,可以准确知道什么时候上传完成,也可以方便地接收到回调数据。
缺点:兼容性差
第三种:使用fileReader读取文件数据进行上传。
HTML5的新api,兼容性也不是特别好,只兼容到了IE10。
var fr = new FileReader()fr.readAsDataURL(file)
fr.onload = function (event) { var data= event.target.result //此处获得的data是base64格式的数据 img.src = data
ajax(url,{data} ,function(){})
}
上面获得的data可以用来实现图片上传前的本地预览,也可以用来发送base64数据给后端然后返回该数据块对应的地址。
优点: 同第二种
缺点:一次性发送大量的base64数据会导致浏览器卡顿,服务器端接收这样的数据可能也会出现问题。
1、前端界面十分简单,只是放一个file类型的和一个按钮,并且为这个按钮添加点击事件(btnUpLoad_Click),如下图:
<input id="UpLoad" runat="server" type="file"></asp:button>
2、后台编写上传按钮点击事件UpLoad_Click里的代码,先大体说一下思路:
根据file类型的控件获得将要上传文件在本机的物理路径;
在这个物理路径中用截取字符串的方法获得文件名(第一步中取得的路径为本机的绝对路径,在服务器上是无效的,所以这里只需要获取文件名);
利用file类型的控件属性PostedFile的SaveAs()方法将相应文件存储到服务器中指定的文件夹中。
3、后台核心代码:
protected void btnUpLoad_Click(object sender, EventArgs e){
//取出所选文件的本地路径
string fullFileName = this.UpLoad.PostedFile.FileName
//从路径中截取出文件名
string fileName = fullFileName.Substring(fullFileName.LastIndexOf(\) + 1)
//限定上传文件的格式
string type = fullFileName.Substring(fullFileName.LastIndexOf(.) + 1)
if (type == doc || type == docx || type == xls || type == xlsx || type == ppt || type == pptx || type == pdf || type == jpg || type == bmp || type == gif || type == png || type == txt || type == zip || type == rar)
{
//将文件保存在服务器中根目录下的files文件夹中
string saveFileName = Server.MapPath(/files) + \ + fileName
UpLoad.PostedFile.SaveAs(saveFileName)
Page.ClientScript.RegisterStartupScript(Page.GetType(), message, <script language='javascript' defer>alert('文件上传成功!')</script>)
//向数据库中存储相应通知的附件的目录
BLL.news.InsertAnnexBLL insertAnnex = new BLL.news.InsertAnnexBLL()
AnnexEntity annex=new AnnexEntity() //创建附件的实体
annex.AnnexName=fileName //附件名
annex.AnnexContent=saveFileName //附件的存储路径
annex.NoticeId = noticeId //附件所属“通知”的ID在这里为已知
insertAnnex.InsertAnnex(annex) //将实体存入数据库(其实就是讲实体的这些属性insert到数据库中的过程,具体BLL层和DAL层的代码这里不再多说)
}
else
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), message, <script language='javascript' defer>alert('请选择正确的格式')</script>)
}
}
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)