使用input如何做到浏览,上传图片?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用input如何做到浏览,上传图片?相关的知识,希望对你有一定的参考价值。

如题 最好有详细代码,下面就是我要实现的页面效果,还请高手们帮帮忙
<body>
<form id="form1" runat="server">
<div>
<table>
<tr>
<td align="right" >上传:</td>
<td align="left"><input id="hif" style="WIDTH: 185px; HEIGHT: 19px" type="file" size="11" runat="server"> 
<asp:dropdownlist id="ddl_FileType" runat="server">
<asp:ListItem Value="picture">图片</asp:ListItem>
<asp:ListItem Value="rm">rm</asp:ListItem>
<asp:ListItem Value="mp3">mp3</asp:ListItem>
<asp:ListItem Value="avi">avi</asp:ListItem>
<asp:ListItem Value="swf">swf</asp:ListItem>
<asp:ListItem Value="other"> 其他</asp:ListItem>
</asp:dropdownlist> 
<asp:button id="btn_UpAtt" runat="server" Text="上传"></asp:button>
<asp:ListBox id="lbx_AttList" runat="server" SelectionMode="Multiple" style="WIDTH: 185px; HEIGHT: 190px"></asp:ListBox>
<asp:Button id="btn_DelAtt" runat="server" Text="删除" ></asp:Button></td>
<td align="left" ></td>
</tr>
</table>
</div>
</form>
</body>

ASP 组件 FILE对象
当前,基于浏览器/服务器模式的应用比较流行。当用户需要将文件传输到服务器上时,常用方法之一是运行FTP服务器并将每个用户的FTP默认目录设为用户的Web主目录,这样用户就能运行FTP客户程序并上传文件到指定的 Web目录。这就要求用户必须懂得如何使用FTP客户程序。因此,这种解决方案仅对熟悉FTP且富有经验的用户来说是可行的。 如果我们能把文件上传功能与Web集成,使用户仅用Web浏览器就能完成上传任务,这对于他们来说将是非常方便的。但是,一直以来,由于File System Object的仅能传送文本文件的局限,所以ASP最大的难题就是文件上传问题。下面介绍的就是如何在基于HTTP协议的网页中实现文件的上传。

一.通过HTTP上传的三种机制

通过HTTP上传有三种机制:RFC1867, PUT 和 WebDAV。

PUT 是在HTTP 1.1引入了一个新的HTTP动词。当web服务器收到一个HTTP PUT和对象名字,它将会验证用户,接收HTTP流的内容,并把它直接存入web服务器。由于这可能会对一个web站点造成破坏,并且还会失去HTTP最大的优势:服务器可编程性。在PUT的情况下,服务器自己处理请求:没有空间让CGI或者ASP应用程序介入。唯一让你的应用程序捕获PUT的方法是在低层操作,ISAPI过滤层。由于相应的原因,PUT的应用很有限。

而WebDAV允许web内容的分布式认证与翻译。它引入了几种新的HTTP动词,允许通过HTTP上传,锁定/解锁,登记/检验web内容。Office 2000中的"Save to web" 就是通过WebDAV来实现的。如果你所感兴趣的一切都是上传内容,WebDAV应用得非常出色,它解决了很多问题。 然而,如果你需要在你的web应用程序里面上传文件,WebDAV对你就毫无用处可言。象HTTP PUT一样,那些WebDAV的动词是被服务器解释的,而不是web应用程序。你需要工作在ISAPI过滤层来访问WebDAV的这些动词,并在你的应用程序中解释内容。

RFC1867 (http://image.21tx.com/files/20060405/21463.txt) 最终被W3C在HTML3.2中接受前,是作为一种建议标准。它是一种非常简单但是功能很强大的想法:在表单字段中定义一个新类型。

<INPUT TYPE="FILE">

并且在表单本身加入了不同的编码方案,不再使用典型的:

<FORM ACTION="formproc.asp" METHOD="POST">

而是使用:

<FORM ACTION="formproc.asp" METHOD="POST" ENCTYPE="multipart/form-data">

这种编码方案在传送大量数据的时候,比起缺省的"application/x-url-encoded"表单编码方案,显得效率要高得多。URL编码只有很有限的字符集,使用任何超出字符集的字符,必须用'%nn'代替,这里的nn表示相应的2个十六进制数字。例如,即使是普通的空格字符也要用'%20'代替。而RFC1867使用多部分MIME编码,就象通常在e-mail消息中看到的那样,不编码来传送大量数据,而只是在数据周围加上很少的简单但实用的头部。主要浏览器的厂商都采用了建议的"浏览..."按钮,用户能很容易的使用本地"打开文件..." 对话框选择要上传的文件。

RFC1867仍然将大多数文件上传的灵活方法留给了你的web应用程序。PUT用得很有限。WebDAV对内容的作者很有用,比如FrontPage用户,但是对想在web应用程序中加入文件上传的web开发者来说很少用到。因此,RFC1867是在web应用程序中加入文件上传的最好的办法。

在实际应用中,微软免费提供了Posting Acceptor 。ASP不懂"multipart/form-data" 编码方案。取而代之,微软提供了Posting Acceptor ,Posting Acceptor是一种在上传完成后,接受REPOST到一个ASP页的ISAPI应用程序。

Software Artisans的SA-FileUp是最早的商业Active Server组件之一。几经改进,现在作为一个纯粹的ASP组件存在。

二.基于ASP的文件上传实现原理分析

基本原理是:采用ADO Stream对象的BinaryRead方法将FORM中的所有数据读出,从中截取出所需的文件数据,以二进制文件方式存盘。

下面是上传文件页面的一个例子(upload.htm):

<html>
<body>
<form name="Upload" Method="Post" Enctype="multipart/form-data" Action="Upload.asp">
<input type="file" name="FileName">
<INPUT TYPE="Submit" VALUE="Upload"></TD>
</form>
</body>
</html>

程序中使用了文件对象,这样在Upload.asp中采用BinaryRead方法读来的原始数据就不仅仅是选择的文件本身的数据,还包含该文件在用户硬盘上的路径、类型、提交页面的表单域名等相关信息的描述,这样我们就需从中提取出文件的具体内容。根据分析,数据的头部信息与数据的分界线是两对回车换行符,尾部也有分隔信息,我们可以采用类似以下的方法获取文件数据。

Dim FormData.FormSize,DataStart,CLStr,DivStr
FormSize=Request.TotalBytes
FormData=Request.BinaryRead(FormSize)
CLStr=ChrB(13)&ChrB(10)
DataStart=InStrB(FormData.CLStr&CLStr)+4
'4是两对回车换行符的长度
DivStr=LeftB(FormData,InStrB(FormData,CLStr)-1)
DataSize=InStrB(DataStart+1,FormData,DivStr)-DataStart-2
FormData=MidB(FormData,DataStart,DataSize)
FormData就是文件的内容了。

中间根据需要,可进行相应的处理。最后的工作就是将文件保存了。保存的方法可以有两种:一种是利用VB或VC之类程序中的二进制文件操作方法,在工程中加入适当的类型库,最终编译成DLL文件,使用时再将该DLL文件注册就可以了。文件存贮程序如下:

Public Function SaveFile(Pathname As String) As String
Dim objContext As ObjectContext
Dim objRequest As Request
Set objContext=GetObjectContext()
Set objRequest=objContext("Request")
'以下的一段代码是进行文件存贮的有关操作
Dim FormData() As Byte,CLStr,DivStr
Dim DataStart As Long,DataSize As Long
DataSize=objRequest.TotalBytes
Redim FormData(DataSize-1)
FormData=objRequest.BinaryRead(DataSize)
CLStr=ChrB(13) & ChrB(10)
DataStart=InStrB(FormData,CLStr & CLStr)+4
DivStr=LeftB(FormData,InStrB(FormData,CLStr)-1)
DataSize=InStrB(DataStart+1,FormData,DivStr)-DataStart-2
FormData=MidB(FormData,DataStart,DataSize)
'创建一个二进制文件并将FormData写入其中
Open Pathname For Binary As 1
Put #1,,FormData
Close #1
SaveFile="OK!"
End Function

第二种方法是利用ADO STREAM中提供的二进制文件操作方法来完成,保存文件的语句是: StreamOBJ.SaveToFile (fileName,2)。在 这种操作中,我们可以将有关的操作存放在一个类文件中,在应用时,直接将该类文件包含在ASP程序中就可以了
参考技术A

浏览器安全性已经大大提高,要实现图片上传预览不是那么简单了

不过有很多变通或先进的方法来实现

例如ie7/ie8的滤镜预览法,firefox 3的getAsDataURL方法

具体可以参考这个图片上传预览效果

参考资料:http://www.blueidea.com/common/shoutbox/redir.asp?2=f&id=11586

本回答被提问者采纳
参考技术B <div class="column " style="width: 400px; margin-left: 200px;" id="imageShow">
<div id="productImageNew">@*用于图片预览*@
</div>
<div id="productImage">
<div class="widget the-common-margin-top" style="height: 400px; border: 1px solid #eeeeee;
padding: 3px;">
<img id="imgHolder" style="max-height: 390px; max-width: 390px;" />
</div>
</div>
</div>
<form id="formImageUpload" name="formImageUpload" method="post" action="/DocTeam/ProductsImage/UploadImage"
enctype="multipart/form-data">
<div id="fileDiv">
<input type="file" id="theFile" name="theFile" size="20" style="cursor: pointer;
width: 65px; height: 60px; position: absolute; filter: alpha(opacity:1); -moz-opacity: 0;
opacity: 0; z-index: 102;" />
</div>
<input type="hidden" name="imageId_hide" id="imageId_hide" />
</form>
<div id="cover" style="position: absolute; background-color: White; z-index: 10;
filter: alpha(opacity=100); -moz-opacity: 1; opacity: 1; overflow: auto; width: 400px;">
<input id="selectImage" type="button" style="width: 65px; height: 60px;" value="Select" />
<br />
<br />
<input type="button" value="Upload" id="imageUpload" style="width: 65px; height: 60px;"
disabled="disabled" onclick="javascript:uploadImage();" />
</div>

//js本地图片预览,兼容ie[6-9]、火狐、Chrome17+、Opera11+、Maxthon3
function PreviewImage(fileObj, imgPreviewId, divPreviewId)
var allowExtention = ".jpg,.bmp,.gif,.png"; //允许上传文件的后缀名document.getElementById("hfAllowPicSuffix").value;
var extention = fileObj.value.substring(fileObj.value.lastIndexOf(".") + 1).toLowerCase();
var browserVersion = window.navigator.userAgent.toUpperCase();
if (allowExtention.indexOf(extention) > -1)
if (fileObj.files) //HTML5实现预览,兼容chrome、火狐7+等
if (window.FileReader)
var reader = new FileReader();
reader.onload = function (e)
document.getElementById(imgPreviewId).setAttribute("src", e.target.result);

reader.readAsDataURL(fileObj.files[0]);
else if (browserVersion.indexOf("SAFARI") > -1)
alert("不支持Safari6.0以下浏览器的图片预览!");

else if (browserVersion.indexOf("MSIE") > -1)
if (browserVersion.indexOf("MSIE 6") > -1) //ie6
document.getElementById(imgPreviewId).setAttribute("src", fileObj.value);
else //ie[7-9]
fileObj.select();
if (browserVersion.indexOf("MSIE 9") > -1)
fileObj.blur(); //不加上document.selection.createRange().text在ie9会拒绝访问
var newPreview = document.getElementById(divPreviewId + "New");
if (newPreview == null)
newPreview = document.createElement("div");
newPreview.setAttribute("id", divPreviewId + "New");

var a = document.selection.createRange().text;
// newPreview.style.width = document.getElementById(imgPreviewId).width + "px";
// newPreview.style.height = document.getElementById(imgPreviewId).height + "px";
//newPreview.style.width = 390 + "px";
newPreview.style.height = 390 + "px";
newPreview.style.border = "solid 1px #eeeeee";
newPreview.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale',src='" + document.selection.createRange().text + "')";
var tempDivPreview = document.getElementById(divPreviewId);
// tempDivPreview.parentNode.insertBefore(newPreview, tempDivPreview);
newPreview.style.display = "block";
tempDivPreview.style.display = "none";


else if (browserVersion.indexOf("FIREFOX") > -1) //firefox
var firefoxVersion = parseFloat(browserVersion.toLowerCase().match(/firefox\/([\d.]+)/)[1]);
if (firefoxVersion < 7) //firefox7以下版本
document.getElementById(imgPreviewId).setAttribute("src", fileObj.files[0].getAsDataURL());
else //firefox7.0+
document.getElementById(imgPreviewId).setAttribute("src", window.URL.createObjectURL(fileObj.files[0]));

else
document.getElementById(imgPreviewId).setAttribute("src", fileObj.value);

else
alert("仅支持" + allowExtention + "为后缀名的文件!");
fileObj.value = ""; //清空选中文件
if (browserVersion.indexOf("MSIE") > -1)
fileObj.select();
document.selection.clear();

fileObj.outerHTML = fileObj.outerHTML;



function setTheFileButton_Cover_SelectImageButton()
// debugger;
// var position = $("#selectImage", "#cover").position();
// var css = top: position.top, left: position.left ;
// $("#theFile", "#fileDiv").css(css);


var $imgHolder = $('#imgHolder', "#productImage");
var tempDiv = $("#temp_div");
$("#select", "#cover").click(function ()
$("#theFile", "#fileDiv").click().select();
);
$("#theFile", "#fileDiv").click(function ()
$(this).blur();
);
$("#theFile", "#fileDiv").change(function ()
PreviewImage(this, 'imgHolder', 'productImage');
setTheFileButton_Cover_SelectImageButton();
// alert("预览已生成!");
$("#imageUpload").prop("disabled", false);
);
参考技术C <input type=“file”/> :文件上传域

点击浏览,可查看本地目录
在文本框输入绝对路径,也可找到文件
若需要上传文件,需将 form 的 enctype 属性设为 multipart/form-data
file 表单不允许设定初始值或通过 js 赋值

创建 file 表单后,dom 结构中会创建一个 FileUpload 对象,后台通过获取该对象,完成文件上传

使用原生input的file属性上传图片和element的多路径上传图片

//使用原生的input属性
//
作品上传 <input class="uploading__input" name="file" @change="readImg($event,‘work‘)" type="file" id="file" value="" accept="image/*" capture="camera" > //封面上传 <input class="uploading__input" name="file" @change="readImg($event,‘cover‘)" type="file" id="file" value="" accept="image/*" capture="camera" > // 上传 readImg(event) { console.log(event); let file = event.target.files[0]; let param = new FormData(); // 创建form对象 param.append("picture", file); // 通过append向form对象添加数据 console.log(param.get("picture")); // FormData私有类对象,访问不到,可以通过get判断值是否传进去 let config = { headers: { "Content-Type": "multipart/form-data" }//设置 请求头 }; uploading_api(param, config).then(res => { this.uploadfrom.picture = res.data; this.$message.success("上传成功"); }); },
使用element批量上传
   结构:   
   <el-upload class="uploading-wrap" :action="actionUrl" //上传路径 `${base.url}home/uploading`,

            :file-list="fileList" //存放图片的数组
            :on-preview="handlePictureCardPreview" //预览
            multiple //批量
            :limit="limitnumber" //最大个数
            list-type="picture-card"//样式
            :on-exceed="isexceed" //超过最大个数的回调
            :on-success="issuccess" // 成功的回调
          >
            <div class="uploading">
              <i
                class="iconfont upload_icon"
                style="color: #FF8A00;display:block;font-size: 38px;"
              >&#xe605;</i>
              <p class="uploading-text1">点击添加作品</p>
              <p class="uploading-text2">支持psd/png/jpg等格式/RGB模式,尺寸不超过800*800px,大小不超过5M</p>
            </div>
          </el-upload>

    <!-- 图片预览 -->
    <el-dialog :visible.sync="dialogVisible">
      <img width="100%" :src="dialogImageUrl" >
    </el-dialog>
 
methods:
    // 预览
    handlePictureCardPreview(file) {
      this.dialogImageUrl = file.url;
      this.dialogVisible = true;
    },
    // 上传图片成功的钩子
    issuccess(res, files, fileList) {
      this.uploadfrom.file = fileList;
    },
 

 

以上是关于使用input如何做到浏览,上传图片?的主要内容,如果未能解决你的问题,请参考以下文章

文件上传控件,做到可以任意删除追加一张图片(或者视频)

前端图片上传思路记录

微信中浏览器支持input调用摄像头和只能上传图片

web 图片上传实现本地预览

微信小程序多张图片上传阿里云时如何做到顺序上传

在上传之前预览多个图像