怎么通过WebService接收base64的值并转换为文件后存放在指定目录下

风吹裤衩轻飞扬丶 2015-07-31 12:03:02
手机端现在需要上传附件,附件经过base64转码并传到接口,那接口该怎么处理?需不需要上传文件类型?怎么通过base64转换成文件呢?
百度了下好多都是只转图片,假如手机端上传word文档怎么用base64转换成文档呢?假如上传的文件是ppt呢又该怎么处理?
有没有一个公共的方法可以转成所有的文件?
跪求方法~~~~
...全文
3930 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
LoserOrLeader 2015-08-03
  • 打赏
  • 举报
回复
引用 7 楼 qwe564217192 的回复:
[quote=引用 4 楼 LoserOrLeader 的回复:] 为什么要转成Base64?可以用Post来传递呀。可以直接用Request来接收,判断文件后缀就知道文件类型了。Base64是字符串,没有文件类型的,除非你们客户端和服务端规定好。
手机端那边不会像PC端那样调用接口时把文件带过来、所以只能先编码下。[/quote] 为什么不可以,完全可以的啊。模拟Post请求把文件类型和文件名都带过来的。
LoserOrLeader 2015-08-03
  • 打赏
  • 举报
回复
引用 18 楼 sp1234 的回复:
手机是可以获取客户端的信息的(例如文件名),而且最重要地是,设计业务流程是业务人员的本份,然后写出准确的系统逻辑设计文档和用户操作手册来。这时候,手机端的设计就说明了问题,手机端知道它自己正在上传那种类型的文件。 胡乱设计一个不明确的流程(然后丢给程序员去瞎琢磨),不但用户用起来莫名其妙,程序很难用,而且开发成本可能也涨10倍呢。
这个说的很对,确实需要明确,我曾经在一个公司就是什么都不说,问了不知道,就是自己搞,搞完这个不对那个不对的。简直把人折磨死。因为他们公司熟悉项目的人已经离职,而且是非常大的外包项目。所以知道整个流程的人基本没有,里边的人全是摸索着写的。。。。
by_封爱 版主 2015-07-31
  • 打赏
  • 举报
回复
你是做服务端的 所以你不用考虑什么所谓的base64之类的东西.. 因为你的参数只需要是byte[] 比如

[webmethod]
public string uploadfile(byte [] data,string name)
{
    //你转换的代码
  return json(new {code=1,msg="成功"});
}
你就可以把data转成任意的name了 可以是jpg rar pdf以及任何东西 . 你的工作就完成了 至于客户端或者手机端以及其他"调用方"如何玩那是他的事,至于他怎么提交你的soap你不需要担心
宝_爸 2015-07-31
  • 打赏
  • 举报
回复
你可以把所有文件都看成二进制文件,用Convert.ToBase64String进行编码。
宝_爸 2015-07-31
  • 打赏
  • 举报
回复
Base64编码后就是字符串了,因此webservice可以接受string类型的参数,然后在用convert.frombase64string 解码,得到文件的内容。
  • 打赏
  • 举报
回复
引用 13 楼 wanghui0380 的回复:
  using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(“你base64后的字符串”)))
                {//有时候为了避免流指针定位错误,显式定义一下指针位置到也可以
                    ms.Seek(0, SeekOrigin.Begin);
                    
                    using (Stream fs = new FileStream("你要保存的文件名,你可以用原始文件名,也可以自己生成文件名,所以需要知道后缀", FileMode.Create))
                    {
                        ms.WriteTo(fs);
                    }
                }
完事了,貌似搞明白了,谢谢哈,测试去了。
於黾 2015-07-31
  • 打赏
  • 举报
回复
如果对方给你传的本来就是文件流转成的base64字符串 那么你把base64字符串重新转成byte[]数组写入文件,然后取个名字(用对方传过来的文件名,或者自己用GUID作为文件名,后面拼接上对方传来的扩展名),不就行了?
  • 打赏
  • 举报
回复
引用 18 楼 sp1234 的回复:
手机是可以获取客户端的信息的(例如文件名),而且最重要地是,设计业务流程是业务人员的本份,然后写出准确的系统逻辑设计文档和用户操作手册来。这时候,手机端的设计就说明了问题,手机端知道它自己正在上传那种类型的文件。 胡乱设计一个不明确的流程(然后丢给程序员去瞎琢磨),不但用户用起来莫名其妙,程序很难用,而且开发成本可能也涨10倍呢。
对,您说的狠对,但现在问题是那不能把所有工作停下来去弥补以前的错失吧。唯一能做的不是在现有的基础上去修改嘛。
  • 打赏
  • 举报
回复
引用 16 楼 Z65443344 的回复:
而如果对方给你传的是个图片文件,图片文件和word文件,excel文件都是文件而已,对方给你二进制数据,你保存成文件,就行了.顶多是需要对方再给你加个参数,扩展名.
恩,就是这个意思,我想的就是对方把流传过来,然后把文件后缀传过来,接着就是我这边写一个通用的方法就好,不管他穿什么流我只需要调用这一个方法就能把文件写入到指定的磁盘内并返回参数给手机端。
  • 打赏
  • 举报
回复
手机是可以获取客户端的信息的(例如文件名),而且最重要地是,设计业务流程是业务人员的本份,然后写出准确的系统逻辑设计文档和用户操作手册来。这时候,手机端的设计就说明了问题,手机端知道它自己正在上传那种类型的文件。 胡乱设计一个不明确的流程(然后丢给程序员去瞎琢磨),不但用户用起来莫名其妙,程序很难用,而且开发成本可能也涨10倍呢。
  • 打赏
  • 举报
回复
引用 13 楼 wanghui0380 的回复:
  using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(“你base64后的字符串”)))
                {//有时候为了避免流指针定位错误,显式定义一下指针位置到也可以
                    ms.Seek(0, SeekOrigin.Begin);
                    
                    using (Stream fs = new FileStream("你要保存的文件名,你可以用原始文件名,也可以自己生成文件名,所以需要知道后缀", FileMode.Create))
                    {
                        ms.WriteTo(fs);
                    }
                }
容我这个白痴在问下,那个路径放哪去,是拼接到文件名那嘛?

public string Rep_UploadDaily( string base64String)
        {
            #region 工作汇报上传
            try
            {
                string path = HttpContext.Current.Server.MapPath("获取路径");
                if (!System.IO.Directory.Exists(path))
                    System.IO.Directory.CreateDirectory(path);
                string fileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", System.Globalization.DateTimeFormatInfo.InvariantInfo) + ".文件类型";

                using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(base64String)))
                {//有时候为了避免流指针定位错误,显式定义一下指针位置到也可以
                    ms.Seek(0, SeekOrigin.Begin);

                    using (Stream fs = new FileStream(fileName, FileMode.Create))
                    {
                        ms.WriteTo(fs);
                    }
                }
            }
            catch (Exception ex)
            {
                return "error_Esc";
            }
            #endregion
        }
於黾 2015-07-31
  • 打赏
  • 举报
回复
首先一点,你必须先明确对方给你传递的到底是个图像对象还是个图片文件,这是完全不同的概念 如果对方给你传递的是图像对象,那么你只能再用函数转回图像,再调用图像对象的保存方法保存. 而如果对方给你传的是个图片文件,图片文件和word文件,excel文件都是文件而已,对方给你二进制数据,你保存成文件,就行了.顶多是需要对方再给你加个参数,扩展名.
wanghui0380 2015-07-31
  • 打赏
  • 举报
回复
引用 14 楼 qwe564217192 的回复:
那你的意思就是有多少种文件类型就要写多少种方法嘛?
让对方把文件名给你传过来就是,因为你需要知道后缀名是什么
  • 打赏
  • 举报
回复
引用 11 楼 sp1234 的回复:
图片以及别的什么文件类型,你应该访问不同的 url。例如 http://www.abc.com/site1/upload_img?data=................... http://www.abc.com/site1/upload_word?data=................... http://www.abc.com/site1/upload_mp3?data=...................
那你的意思就是有多少种文件类型就要写多少种方法嘛?
wanghui0380 2015-07-31
  • 打赏
  • 举报
回复
算了,反正也是闲着,就给你写下
  using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(“你base64后的字符串”)))
                {//有时候为了避免流指针定位错误,显式定义一下指针位置到也可以
                    ms.Seek(0, SeekOrigin.Begin);
                    
                    using (Stream fs = new FileStream("你要保存的文件名,你可以用原始文件名,也可以自己生成文件名,所以需要知道后缀", FileMode.Create))
                    {
                        ms.WriteTo(fs);
                    }
                }
  • 打赏
  • 举报
回复
引用 10 楼 qwe564217192 的回复:
由于上传的文件可能不同,所以不知道有没有一个方法可以试用与全部文件的写入。
你在对“服务”的概念认识方面,看来有一些“一根筋”的成分。不能去掉这个成分,就不能做一个懂业务的程序员。
  • 打赏
  • 举报
回复
引用 5 楼 qwe564217192 的回复:
进行图片转换,我的意思是假如这个文件不是图片了怎么转换。
呵呵, 图片以及别的什么文件类型,你应该访问不同的 url。例如 http://www.abc.com/site1/upload_img?data=................... http://www.abc.com/site1/upload_word?data=................... http://www.abc.com/site1/upload_mp3?data=...................
  • 打赏
  • 举报
回复
引用 8 楼 findcaiyzh 的回复:
读取到byte[],然后想保存成文件,或者数据库都可以 byte[] fileContent = ms.ToArray();
恩,这个我也读取到了。路径我也能拿到,现在是写入到磁盘不会写入。由于上传的文件可能不同,所以不知道有没有一个方法可以试用与全部文件的写入。 我百度了下搜到了这个方法:

byte[] byteimage = Convert.FromBase64String(base64String);
System.IO.File.WriteAllBytes(@"c:\test.jpg", byteimage);
它说这个可以直接根据byte[]写入文件,但是适应于图片,不知道他适应于压缩包或者文档视频嘛?
wanghui0380 2015-07-31
  • 打赏
  • 举报
回复
你首先要知道文件后缀 其次 在去百度“FileStream”操作,一个流写到另一个流不是什么复杂操作,我就不写代码了,自己百度把
宝_爸 2015-07-31
  • 打赏
  • 举报
回复
引用 5 楼 qwe564217192 的回复:
[quote=引用 2 楼 findcaiyzh 的回复:] 你可以把所有文件都看成二进制文件,用Convert.ToBase64String进行编码。
我编码后我又用
 
       MemoryStream ms = new MemoryStream(iamgebytes);
        Image image = Image.FromStream(ms);
        return image;
进行图片转换,我的意思是假如这个文件不是图片了怎么转换。[/quote] 读取到byte[],然后想保存成文件,或者数据库都可以 byte[] fileContent = ms.ToArray();
加载更多回复(4)

110,546

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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