工作中遇到了webservice上传文件的情况,起初只是上传图片,由于图片的内存较小,故可以直接将图片转换为base64编码的字符串,具体代码如下
// imageName为图片的base64编码字符串,strFileName为图片的上传路径
MemoryStream stream = new MemoryStream(Convert.FromBase64String(imageName));
Bitmap bitmap = (Bitmap)Image.FromStream(stream);
bitmap.Save(strFileName, ImageFormat.Png);
后面由于工作需要,需添加上传视频的功能,但是由于视频的内存空间可能比较大,当使用base64编码时,字符串接收会超出有效长度,故只能采用form表单的形式上传,android端使用了表单的形式上传文件,接口中无法直接传入参数,需使用接口中代码如下
HttpContext.Current.Request.Params["strDbid"].ToString()来获取相应的参数,然后做进一步操作
string strDbid = HttpContext.Current.Request.Params["strDbid"].ToString();//这里如果前台没有用jsonp,那么获取到的是一个?,所以处理完之后,前台是没法获取到服务器返回的内容的。
//上面代码必须,不能注释
//中间代码执行自己的业务操作,可返回自己的任意信息(多数据类型)
HttpFileCollection files = HttpContext.Current.Request.Files;
//string strFileName = HttpContext.Current.Request["filename"];获取文件名称
byte[] b = new byte[files[0].ContentLength];
System.IO.Stream fs = (System.IO.Stream)files[0].InputStream;
fs.Read(b, 0, files[0].ContentLength);
///定义并实例化一个内存流,以存放提交上来的字节数组。
MemoryStream m = new MemoryStream(b);
///生成文件名称
string str = DateTime.Now.ToString("yyyyMM");
string str2 = DateTime.Now.ToString("yyyyMMdd");
string path = this.strImageWebUrl + @"\uploads\C" + strDbid;
string str5 = this.strImageWebUrl + @"\uploads\C" + strDbid;
if (!Directory.Exists(path + @"\movs\" + str))
{
Directory.CreateDirectory(path + @"\movs\" + str);
}
path = path + @"\movs\" + str;
if (!Directory.Exists(path + @"\" + str2))
{
Directory.CreateDirectory(path + @"\" + str2);
}
path = path + @"\" + str2;
int num = new Random().Next(0x2710);
string str6 = DateTime.Now.ToString("yyyyMMddHHmmss") + num.ToString() + Guid.NewGuid().ToString() + ".mp4";
string filename = path + @"\" + str6;//文件物理路径
//FileStream f = new FileStream(Server.MapPath("\\UploadFile") + "\\" + files[0].FileName, FileMode.Create);
FileStream f = new FileStream(filename, FileMode.Create);
///把内内存里的数据写入物理文件
m.WriteTo(f);
m.Close();
f.Close();
f = null;
m = null;
android端代码就不多说了 我也不会 嘿嘿