form类型为multipart/form-data,怎么获得上传图片?

cuizhanjun1981 2007-10-16 04:50:25
必须用multipart/form-data方式上传图片。

然后在.cs文件中,
(1、)获得图片的2进制数据,(这个不明白)
(2、)并把2进制数据转回图片,保存到d盘。(这个不明白)

注: 不用别人的组件。

有经验的兄弟,给个资料或代码。100分送上。
...全文
20319 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Go 旅城通票 2007-10-19
  • 打赏
  • 举报
回复
 
private void ErrHandle(string ErrMsg)
{
ErrMsg = ErrMsg.Replace("'", "\'");//防止脚本符号的嵌套出错
HttpContext.Current.Response.Write("<script>alert('" + ErrMsg + "');history.back();</" + "script>");
HttpContext.Current.Response.End();
}

private string getExt(int start, int DataSize, ref string filename, ref string Key)
{
string fileExt = null, desInfo = "";
byte[] desBytes = new byte[DataSize];
desBytes = ReadBytes(start, DataSize);
desInfo = Encoding.UTF8.GetString(desBytes);
desInfo = desInfo.Substring(desInfo.IndexOf("name=\"") + 6);
Key = desInfo.Substring(0, desInfo.IndexOf("\""));
int fnStart = desInfo.IndexOf("filename=\"");
if (fnStart != -1)
{
filename = desInfo.Substring(fnStart + 10);
if (filename.IndexOf("\"") != 0)//有可能未上传文件
{
filename = filename.Substring(0,filename.IndexOf("\""));
fileExt = Path.GetExtension(filename).ToLower().Substring(1);
}
else
fileExt = "";
}
return fileExt;
}
/// <summary>
/// 验证单个文件大小
/// </summary>
/// <param name="datasize">文件大小</param>
/// <returns>是否合格</returns>
private bool checkFileSize(int datasize)
{
if (datasize > maxFileSize * 1024)
return false;
else
return true;
}
/// <summary>
/// 验证扩展名是否允许
/// </summary>
/// <param name="fileExt">扩展名</param>
/// <returns>是否合格</returns>
private bool checkExt(string fileExt)
{
string[] exts = allowExts.Split('|');
foreach (string ext in exts)
{
if (ext == fileExt)
return true;
}
return false;
}
/// <summary>
/// 获取流中的字节数组
/// </summary>
/// <param name="DataStart">流开始处</param>
/// <param name="DataSize">数组大小</param>
/// <returns>字节数组</returns>
private byte[] ReadBytes(int DataStart, int DataSize)
{
byte[] ReturnBytes = new byte[DataSize];
binReader.BaseStream.Position = DataStart;
binReader.Read(ReturnBytes, 0, DataSize);
return ReturnBytes;
}
/// <summary>
/// 读取bytes数组数据
/// </summary>
/// <param name="DataStart">开始位置</param>
/// <param name="DataSize">大小</param>
private string ReadData(int DataStart, int DataSize)
{
if (DataSize < 1)
return "";
else
{
byte[] bytesData = new byte[DataSize];
bytesData = ReadBytes(DataStart, DataSize);
string Str = Encoding.UTF8.GetString(bytesData);
if (Str == "\r\n")
return "";
else
return Str;
}
}
/// <summary>
/// 读取bytes数组数据
/// </summary>
/// <param name="DataStart">开始位置</param>
/// <param name="DataSize">大小</param>
/// <param name="Key">键名称</param>
/// <param name="FileName">服务器的文件名</param>
/// <param name="sFileName">客户端的文件名</param>
private void ReadData(int DataStart, int DataSize, string Key,string FileName,string sFileName)
{
MyFileInfo myFileInfo = new MyFileInfo();
myFileInfo.FileData = ReadBytes(DataStart, DataSize);
myFileInfo.FileName = FileName;
myFileInfo.SFileName = sFileName;
fileCollections.Add(Key, myFileInfo);
allFile += FileName + ",";
}
/// <summary>
/// 搜索给定2进制数在数组中的位置
/// </summary>
/// <param name="startPosition">要搜索开始的位置,默认为0</param>
/// <param name="b">要搜索的2进制数组</param>
/// <param name="sb">搜索的2进制数数组</param>
/// <returns>所在位置,找不到默认为-1</returns>
private int InStrB(int startPosition, byte[] b, byte[] sb)
{
int blen = b.Length;
if (startPosition >= blen)
return -1;
int sblen = sb.Length;
int postion = -1;
if (sblen == 0)
return -1;
for (int i = startPosition; i < blen; i++)
{
if (b[i] == sb[0])
{
int TempI = i + 1;
bool Find = true; ;
for (int j = 1; j < sblen && TempI < blen; j++, TempI++)
{
if (b[TempI] == sb[j])
continue;
else
{
Find = false;
break;
}
}
if (Find)
{
postion = i;
break;
}
}
}
return postion;
}


测试页面
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>asp.net无组件上传</title>
<meta http-equiv="content-type" content='text/html;utf-8' />
</head>
<body>
<script type="text/javascript">
function check(f)
{
var choose=false;
//至少要选择一个文件
for(var i=0;i<10;i++)
{
if(eval("f.myfile"+i)!=undefined)
{
if(eval("f.myfile"+i).value!="")
{
choose=true;
break;
}
}
}
if(!choose)
{
alert('请选择上传的文件!');
f.myfile0.focus();
return false;
}
}
function SetFile()
{
var fc=document.getElementById('filecount');
if(fc.value=="")
{
alert('文件个数不能为空!');
fc.focus();
return ;
}
if(isNaN(fc.value))
{
alert('文件个数为整数!');
fc.select();
return;
}
var count=parseInt(fc.value);
if(count<1||count>10)
{
alert('一次上传文件个数为1-10个!');
fc.select();
return false;
}
var div=document.getElementById('divFile');
div.innerHTML="";
for(var i=0;i<count;i++)
{
div.innerHTML+='请选择文件:<input type="file" name="myfile'+i+'" style="width:200px" /><br/>';
}
}
</script>
<form method="post" enctype='multipart/form-data' action="getfile.aspx" onsubmit="return check(this)">
 文件个数:<input type="text" size='2' name='filecount' id='filecount' />(1-10个)<input type="button" onclick='SetFile()' value="设置上传个数"/>
<div id='divFile'>请选择文件:<input type="file" name="myfile0" style="width:200px" /></div>
<input type="submit" value='开始上传' />
</form>
</body>
</html>

接收页面
<%@ Page Language="C#" %>
<%@ Import Namespace="ShowBo.AspNetUpLoad" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
UpLoad upload = new UpLoad();
upload.CollectFormDatas();
upload.Save();//保存文件,如果保存到数据,你可以迭代FileCollections中的文件信息获取2进制文件数据
string Err = upload.ErrorStr;
Response.Write(upload.FormCollections["filecount"]);
if (Err != "")
Response.Write(Err);
else
Response.Write("Ok");
}
</script>
Go 旅城通票 2007-10-19
  • 打赏
  • 举报
回复
/// <summary>
/// 文件上传类
/// </summary>
public class UpLoad
{
#region 变量申明
private byte[] FormData; //表单的2进制数据数组
private int formSize;//总上传字节数
private string allowExts;//默认的可以上传的文件扩展名称
private string rootPath;//文件保存的目录
private string fileErr;//文件错误信息,例如文件大小超过,扩展名不允许
private string allFile;//保存所有成功上传的文件名称

private int maxFileSize;//默认上传大小为200kb
private int fileCount;//总的上传的文件个数

private byte[] SplitStr;//2进制分隔符号
private int SplitStrLen;//分隔符号长度
byte[] CLStr = new byte[] { 13, 10 };//2进制回车

private FileCollection fileCollections = new FileCollection();//文件信息集合
private FormCollection formCollections = new FormCollection();//表单信息集合

private BinaryReader binReader;//2进制读取器
#endregion

#region 属性
/// <summary>
/// 默认的可以上传的文件扩展名称
/// </summary>
public string AllowExts
{
get { return allowExts; }
set { allowExts = value; }
}
/// <summary>
/// 文件保存的目录
/// </summary>
public string RootPath
{
get { return rootPath; }
set
{
string tempPath = value;
if (tempPath.LastIndexOf("/") == -1)
rootPath = tempPath + "/";
else
rootPath = tempPath;
}
}
/// <summary>
/// 错误信息,只读属性
/// </summary>
public string ErrorStr
{
get
{
if (fileErr != "")
fileErr = "发生如下错误\n" + fileErr;
return fileErr;
}
}
/// <summary>
/// 文件信息集合,2进制流形式缓存数据,只读属性
/// </summary>
public FileCollection FileCollections
{
get { return fileCollections; }
}
/// <summary>
/// 表单信息集合,只读属性
/// </summary>
public FormCollection FormCollections
{
get { return formCollections; }
}
/// <summary>
/// 所有文件在服务器上生成的文件名,只读属性
/// </summary>
public string FileNames
{
get
{
return allFile;
}
}
/// <summary>
/// 文件数量,只读属性
/// </summary>
public int FileCount
{
get { return fileCount; }
}
#endregion

public UpLoad()
{
allowExts = "jpg|png|gif";
rootPath = "uploadfiles/";
maxFileSize = 200;
allFile = "";
fileErr = "";
fileCount = 0;
}
/// <summary>
/// 保存文件到硬盘
/// </summary>
public void Save()
{
string FilePath = "";
FileStream fileStream;
foreach (MyFileInfo mfi in fileCollections)
{
try
{
FilePath = HttpContext.Current.Server.MapPath(rootPath + mfi.FileName);//获取文件的物理路径
fileStream = new FileStream(FilePath, FileMode.OpenOrCreate);
fileStream.Write(mfi.FileData, 0, mfi.FileData.Length);
fileStream.Flush();
fileStream.Close();
}
catch
{
fileErr += mfi.SFileName+"保存失败!\n";
}
}
}
/// <summary>
/// 以时间和文件第几个为文件重新命名
/// </summary>
/// <param name="Ext">扩展名</param>
/// <param name="fileCount">第几个文件,防止服务器处理速度快,一个时间内能处理几个文件,那么用时间生成的文件名有可能被覆盖。</param>
/// <returns>新文件名</returns>
private string getFileName(string Ext, int fileCount)
{
return DateTime.Now.ToString().Replace(":", "").Replace(" ", "").Replace("-", "") + fileCount.ToString() + "." + Ext;
}
/// <summary>
/// 获取表单数据项目
/// </summary>
public void CollectFormDatas()
{
string sfilename = "", fileExt = "",FileName="";
string Key = "";//表单键名称
int DataSize, headstart, headend;

formSize = HttpContext.Current.Request.TotalBytes;
if (formSize < 1)
{
ErrHandle("没有选择上传的文件!");
}

FormData = new byte[formSize];

binReader = new BinaryReader(HttpContext.Current.Request.InputStream);
binReader.Read(FormData, 0, formSize);

SplitStrLen = InStrB(0, FormData, CLStr);
SplitStr = new byte[SplitStrLen];

binReader.BaseStream.Position = 0;//设置流位置
binReader.Read(SplitStr, 0, SplitStrLen);//获取2进制分隔符号

headstart = SplitStrLen + 2;//第一个集合的描述信息位置
do
{
headend = InStrB(headstart, FormData, new byte[] { CLStr[0], CLStr[1], CLStr[0], CLStr[1] });//两对回车换行符
DataSize = InStrB(headend + 4, FormData, SplitStr) - (headend + 4)-2;
fileExt = getExt(headstart, headend - headstart , ref sfilename, ref Key);
if (fileExt == null)//表单集合
{
formCollections.Add(Key, ReadData(headend+4, DataSize));
}
else if (fileExt != "")//文件
{

if (!checkFileSize(DataSize))
fileErr = fileErr + sfilename + "上传失败,文件大小超过" + maxFileSize + "KB!\n";
else if (!checkExt(fileExt))
fileErr = fileErr + sfilename + "上传失败,文件类型 " + fileExt + " 不允许上传!\n";
else
{
fileCount = fileCount + 1;//累计文件个数
FileName = getFileName(fileExt, fileCount);
ReadData(headend+4, DataSize, Key,FileName,sfilename);
}
}
//计算下项开始位置
headstart = (headend+4) + DataSize +2+ (SplitStrLen + 2);
} while (headstart + 2 < formSize);
binReader.Close(); //关闭流
}

Go 旅城通票 2007-10-19
  • 打赏
  • 举报
回复
看你给了我100分,刚好这两天没工作任务,写了个asp.net无组件上传的类,调试通过.

/*
Asp.Net无组件上传(1.0.0.0)。
.net Framework2.0+IIS6.0 调试通过。
--Edit By ShowBo于2007.10.19 10:00
*/
namespace ShowBo.AspNetUpLoad
{
using System;
using System.IO;
using System.Web;
using System.Text;
using System.Collections;
/// <summary>
/// 文件结构
/// </summary>
public struct MyFileInfo
{
public string FileName;//服务器端的文件名
public string SFileName;//客户端的文件名
public byte[] FileData;//文件的2进制数据
}
/// <summary>
/// 表单项收集
/// </summary>
public class FormCollection : DictionaryBase
{
/// <summary>
/// 添加项目
/// </summary>
/// <param name="Key">键</param>
/// <param name="Value">值</param>
public void Add(string Key, string Value)
{
Dictionary.Add(Key, Value);
}
/// <summary>
/// 获取或设置对应的键值
/// </summary>
/// <param name="Key">键</param>
/// <returns>值</returns>
public string this[string Key]
{
get { return (string)Dictionary[Key]; }
set { Dictionary[Key] = value; }
}
/// <summary>
/// 重写叠代借口返回,返回string类型
/// </summary>
/// <returns>IEnumerator叠代接口</returns>
public new IEnumerator GetEnumerator()
{
foreach (DictionaryEntry de in Dictionary)
{
yield return (string)de.Value;
}
}
/// <summary>
/// 删除键值
/// </summary>
/// <param name="Key">要删除的键值</param>
public void Remove(string Key)
{
Dictionary.Remove(Key);
}
}

/// <summary>
/// 上传文件收集,信息为2进制
/// </summary>
public class FileCollection : DictionaryBase
{
public void Add(string Key, MyFileInfo fileInfo)
{
Dictionary.Add(Key, fileInfo);
}
public void Remove(string Key)
{
Dictionary.Remove(Key);
}
/// <summary>
/// 重写迭代接口接口
/// </summary>
/// <returns>返回文件的MyFileInfo结构体</returns>
public new IEnumerator GetEnumerator()
{
foreach (DictionaryEntry de in Dictionary)
{
yield return (MyFileInfo)de.Value;
}
}
public MyFileInfo this[string Key]
{
get { return (MyFileInfo)Dictionary[Key]; }
set { Dictionary[Key] = value; }
}
}

cuizhanjun1981 2007-10-17
  • 打赏
  • 举报
回复
to:10楼,你答非所问嘛,其实7楼也貌似看了一下就复制粘贴了一下。
cuizhanjun1981 2007-10-17
  • 打赏
  • 举报
回复
呵呵~~~ 看了一下,写错了,得到图片信息了。现在只需要把 图片生成就好了,哎~~~~ 试一下,看看怎么保存图片了。
----------------------------------------------------------

-----------------------------7d71283b3e0f36\r\nContent-Disposition: form-data; name=\"Text1\"\r\n\r\n55555555555\r\n-----------------------------7d71283b3e0f36\r\nContent-Disposition: form-data; name=\"File1\"; filename=\"E:\\信息发布系统\\SiteDesigner\\images\\addtable.gif\"\r\nContent-Type: image/gif\r\n\r\nGIF89a\0\0�[\0��������ң��9r⠯����`�Y��������������Ƕ�ѽ�ڎ��G~@\\�UK�C��Ԧ�Ϛ�ʉ��������b�����S�LF{�@v㞮������q����������md�]�隩�>v�e�
WNASP 2007-10-17
  • 打赏
  • 举报
回复
up
yuan74521940 2007-10-17
  • 打赏
  • 举报
回复
如何显示数据库中Image类型的图片
1.数据库表结构

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Person]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Person]
GO

CREATE TABLE [dbo].[Person] (
[PersonID] [int] IDENTITY (1, 1) NOT NULL ,
[PersonImage] [image] NULL ,
[PersonImageType] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
10GO


2.显示图片的代码,把下面的代码随便放到一个aspx页面的pageload事件中

void GetImageSrcFromDB()
{
string strImageID = Request.QueryString["id"];
SqlConnection myConnection = new SqlConnection("Data Source=.;Initial Catalog=mxh;User Id=sa;Password=sa;");
SqlCommand myCommand = new SqlCommand("Select PersonImageType, PersonImage from Person Where PersonID="
+ strImageID, myConnection);

try
{
myConnection.Open();
SqlDataReader myDataReader;
myDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
if(myDataReader.Read())
{
Response.Clear();

//Response.ContentType = myDataReader["PersonImageType"].ToString();
Response.BinaryWrite((byte[])myDataReader["PersonImage"]);
}
myConnection.Close();
}
catch (SqlException SQLexc)
{
Response.Write(SQLexc.ToString());
}
//Response.End();
}
3.构造数据,通过上传的方式把图片存入数据库,下面的代码放入一个上传按钮的单击事件中,页面上在加一个上传控件

//获得图象并把图象转换为byte[]
HttpPostedFile upPhoto=UpPhoto.PostedFile;
int upPhotoLength=upPhoto.ContentLength;
byte[] PhotoArray=new Byte[upPhotoLength];
Stream PhotoStream=upPhoto.InputStream;
PhotoStream.Read(PhotoArray,0,upPhotoLength);

//连接数据库
SqlConnection conn=new SqlConnection();
conn.ConnectionString="Data Source=localhost;Database=mxh;User Id=sa;Pwd=sa";

string strSql="Insert into Person(PersonImage,PersonImageType) values(@FImage,'jpeg')";
SqlCommand cmd=new SqlCommand(strSql,conn);
cmd.CommandType=CommandType.Text ;

//如果你希望不使用存储过程来添加图片把上面四句代码改为:

//SqlCommand cmd=new SqlCommand(strSql,conn);
cmd.Parameters.Add("@FImage",SqlDbType.Image);
cmd.Parameters["@FImage"].Value=PhotoArray;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();




4.显示图片的代码,建立一个新的aspx页面,然后显示图片

<asp:Image id="Image1" runat="server" ImageUrl="ReadImage.aspx?id=1"></asp:Image>
cuizhanjun1981 2007-10-17
  • 打赏
  • 举报
回复

to:8楼
我的发出请求的不是页面,所以不可能用.net自带控件。

to:7楼
先谢谢你,ADODB.Stream是个组件,需要在服务器安装才能用吧,我现在能获得图片的文件名和但是怎么获得图片数据?我不明白!
-----------------------------------------------------------------------------------------
我的代码:
int formSize = Request.TotalBytes;//提交大小
byte[] formData = Request.BinaryRead(formSize);//提交字节

string str = System.Text.UTF8Encoding.UTF8.GetString(formData);
Response.Write(str);

str值(表单内容):

-----------------------------7d733c1e7a0a1e
Content-Disposition: form-data; name="Text1"

555555555555
-----------------------------7d733c1e7a0a1e
Content-Disposition: form-data; name="File1"; filename="C:\Documents and Settings\Administrator\妗岄潰\add.gif"
Content-Type: image/gif

GIF89a+

我不明白的是:
虽然表单数据描述我知道,但我得不到图片数据的流啊?我知道了filename="C:\Documents and Settings\Administrator\妗岄潰\add.gif" 也没有用啊,怎么才能找到图片数据呢?

Go 旅城通票 2007-10-17
  • 打赏
  • 举报
回复
你也是的,有.net的自带上传控件何必使用自己编写呢,找累啊.
Go 旅城通票 2007-10-17
  • 打赏
  • 举报
回复
按asp的方法取数据就行了贝,给篇文章给你参考,csharp的代码你自己按下面的vbscript代码转换下就可以了.


1、文件上传表单

首先需要编写一个能提供文件上传功能的表单,程序如下所示:

<Form action="upload.asp" method=post enctype="multipart/form-data">
上传文件:<Input type=file name=file1><br>
<input type=submit name=upload value="上传">
</form>

其中,enctype参数用来设置表单的MIME编码方式,在进行文件(或同时包含文本框)上传时,必须将其属性设置为"multipart/form-data";upload.asp是服务器端对接收到的二进制文件流进行处理的ASP程序,在本文的后面将陆续介绍其内容。

2、上传文件格式分析

在处理文件之前,我们要先了解上传的文件的具体格式,通过编写下面一段简单的ASP程序就可以查看其二进制代码:

<%
filesize=Request.TotalBytes '获得上传文件的大小
filedata=Request.BinaryRead(filesize) '获得上传文件的二进制数据
Response.BinaryWrite filedata '在浏览器上显示二进制数据
%>

分析浏览器上显示的上传文件的二进制代码,发现代码包括四个部分(若同时上传多个文件或文本框,则代码按上传的先后次序排列,格式相同),每一部分的内容是用回车换行符号来进行分隔的:

1)第一部分(起始标志)
-----------------------------7d329631b04d4
2)第二部分(文件说明)

Content-Disposition: form-data; name="file1"; filename="C:\Documents and Settings\Administrator\My Documents\Invitation.doc" Content-Type: application/msword


在此,我们可以获得上传文件的文件名称及绝对路径,也可以获得文件类型。这些信息是正确保存文件所不可缺少的。

3)第三部分(文件内容)

即文件的二进制内容,略。

4)第四部分(结束标志)

-----------------------------7d329631b04d4

结合第一部分和第四部分的内容来看,"-----------------------------7d329631b04d4"(每次上传,数值都不一样)起到了分割符的作用,它标志着一段数据(当有多个上传内容时)的开始和结束。从保存文件所需要的信息来讲,我们首先需要从第二部分数据的"filename"中获得文件名称,然后需要正确定位文件的起始位置,最后利用ASP技术将二进制文件用本来的文件名保存即可。若同时上传多个内容(如多个文本框和文件),也是按同样的方法处理,每部分的内容都包含在分割符之中,只是文本框和文件的表现形式稍有不同,这可以通过具体分析其二进制代码来了解。

3、利用ASP技术实现文件存储

上传文件代码的处理

1) 获得分割符代码

从上面的分析我们已经知道,分割符起到了分割多个数据段(包括文本框和各种类型的文件)的重要作用。前面已经分析过,分割符出现在第一个回车换行符号前。因此,通过下面这段程序就可获得分割符代码:

<%
newline=chrB(13) & chrB(10) 'newline表示二进制的回车符
filesize=Request.TotalBytes 'filesize是上传文件的大小
filedata=Request.BinaryRead(filesize) 'filedata是上传文件的二进制数据
divider=leftB(filedata,clng(instrb(filedata,newline))-1) 'divider是分割符
%>

注:因为这里处理的都是二进制字节码,因此,所有的函数都是使用它的二进制版本,加了"b "。

2) 获得文件(或文本框)内容

(1) 预备函数(将二进制串转化成字符串)

上传文件的内容不需要经过二进制向字符串的转换过程,直接保存就可。但是,若需提取文本框内容或文件的名称,就必须进行转换。因此,需要编写一个通用的,并且适用于汉字的转换函数。以下是该函数代码:

Function BtoS (bstr)
If not Is Null (bstr) Then
for i = 0 to lenb(bstr) - 1
bchr = midb(bstr,i+1,1)
If ascb(bchr)>127 Then '汉字是双字节,得两个字符一起处理
temp = temp&chr(ascw(midb(bstr, i+2, 1)&bchr))
i = i+1
Else
temp = temp&chr(ascb(bchr))
End If
next
End If
BtoS = temp
End Function

(2) 获得文件(或文本框)内容

在实际的WEB应用中,上传操作可能涉及多项内容,如多个文本框、多个文件等等。文件和文本框很好区分,文件的数据中包含了"filename="字串。因此,我们写了如下的通用函数,既可用于提取文件内容,又可提取文本框内容(需进行二进制转换):

Function getdata(byval data, byval divider, final) 'data表示二进制串;divider表示分割符;final表示数据的结束位置
filename=chrb(102)&chrb(105)&chrb(108)&chrb(101)&chrb(110)&chrb(97)&chrb(109)&chrb(101)&chrb(61)&chrb(34) '字符串filename="的二进制表示
bncrlf=chrb(13)&chrb(10) '二进制的回车符
startpos = instrb(data,divider)+lenb(divider)+lenb(bncrlf) ' 开始位置
endpos = instrb(startpos,data, divider)-lenb(bncrlf) '结束位置
part1 = midb(data, startpos, endpos-startpos) '两个分割符之间的内容
firstline = midb(part1, 1, instrb(part1, bncrlf)-1) ' 内容之前的说明段
If (instrb(firstline,filename)=0) Then '若为文本框,获得文本框字符串内容
stemp=midb(part1,instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf),lenb(part1)-instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf))
getdata=BtoS(stemp)
Else '若为文件,获得文件二进制内容
Getdata=midb (part1, instrb (part1, bncrlf&bncrlf)+lenb (bncrlf&bncrlf), lenb (part1)
-instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf))
End If
Final=endpos
End function

在程序中直接调用该函数就可获得所需文件(或文本框)内容,如下所示:

<%
Content=getdata (data, divider, position)
%>

3) 获得文件名称
前面已经分析过了,上传文件数据流的"filename="字段里包含了文件的名称和绝对路 径。一般来说,我们只需提取出路径中的文件名即可,以下是程序代码:

<%
namepos=instrrev(B2S(firstline),chr(92)) 'firstline即上面获得的说明部分数据,chr(92)
表示"/"
filename=midb(firstline,namepos+1,lenb(firstline)-namepos-1) '获得文件名称
%>

利用ASP直接实现文件上传功能

传统的ASP程序员只能利用FILESYSTEMOBJECT对象对文本文件(.txt)进行移动、复制、删除等操作,若需处理二进制对象,则不得不采用本文前面介绍的那些方法来实现。但是,现在ASP中的ADO.STREAM对象可以同时操作文本对象和二进制对象(可以在http://www.microsoft.com/data下载),利用它就可以在ASP中直接实现文件上传功能。下面,我们就介绍其实现过程。

1)打开STREAM对象

对于SREAM对象而言,若要进行文件的保存,则必须是将该对象的全部内容进行保存。因此,我们必须要创建两个(或多个)STREAM对象,其中一个为源数据流,即接收初始的二进制数据;另一个为目的数据流,即接收来自经源数据流处理后的数据,并最终保存为所需的文件。

<%
set str=server.CreateObject("ADODB.Stream") 'str为源数据流
str.Mode=3 '设置打开模式,3为可读可写
str.Type=1 '设置数据类型,1为二进制数据
str.Open
set desc=server.CreateObject("ADODB.Stream") 'desc为目标数据流
desc.Mode=3
Desc.Type=1
desc.Open
%>

2)STEAM对象间内容的复制

在该部分,必须在源数据流中定位文件开始的位置,并且求出文件内容的长度,才能将文件正确的复制到目的数据流中,并且保存文件,程序代码如下:

<%
formdata=Request.BinaryRead(Request.TotalBytes) 'formdata为上传的所有内容
str.Write formdata ' 赋值源数据流
str.position=count-lenb(result)-2 'position指出文件的开始位置
str.copyto desc, lenb(filecotent) 'lenb(filecontent)表示文件的长度
desc.SaveToFile fullpath,2 '以fullpath指定的路径及名称保存文件
%>

3)关闭STEAM对象

编程完成后,应关闭并释放STEAM对象,如下所示:

<%
Desc. Close
Set desc=nothing
Str. Close
Set STR=nothing
%>

总结

本文给出了利用ASP直接实现文件上传的方法,在本单位自行开发的信息管理系统中得到了很好的应用。实践证明:与传统的几种文件上传方法相比,该方法更简便、更高效。
vlysses 2007-10-17
  • 打赏
  • 举报
回复
没辙!帮顶
cuizhanjun1981 2007-10-17
  • 打赏
  • 举报
回复
楼上的,我不能用 .net自带的上传控件。我提交数据的不是一个页面。
whycom 2007-10-16
  • 打赏
  • 举报
回复
<input type="file" runat="server" id="file1"/>
cuizhanjun1981 2007-10-16
  • 打赏
  • 举报
回复
int formSize = Request.TotalBytes;//提交大小
byte[] formData = Request.BinaryRead(formSize);//提交字节

string str=System.Text.UTF8Encoding.Default.GetString(formData);
Response.Write(str);
---------------------------------------------
为什么 str只输出 分割头,我表单里 一个textbox 一个image呢???????

"-----------------------------7d73e27210e40--"









晕,这个没人知道吗?????????????
cuizhanjun1981 2007-10-16
  • 打赏
  • 举报
回复
就是asp.net的无组件上传,但是不能用.net自带的上传控件
cuizhanjun1981 2007-10-16
  • 打赏
  • 举报
回复
高手快来饿!!!

62,050

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧