博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
前端使用c# winform创建客户端来进行post发送文件,后台使用java来接收
阅读量:5292 次
发布时间:2019-06-14

本文共 7575 字,大约阅读时间需要 25 分钟。

需求:1、前台通过c# 来上传参数及文件; 2、后台通过java编写服务器端代码来接收;

分析:

  一、针对1,有很多方式来进行传输,比如Ftp方式,HttpWebRequest方式等,我们这里使用HttpWebRequest方式来进行post请求。

  二、针对2,我使用commons-fileupload-1.2.1.jar来进行文件接收。

代码:

  1、前端代码:

1 // 拼接上传远程服务器路径 2             string url = serverAddress + "/fileupload/upload"; 3  4             // 拼接同文件一同上传的表单文本域及值(即传入的参数) 5             NameValueCollection nvc = new NameValueCollection(); 6             nvc.Add("templateId", templateId); // 传入概预算工程ID参数 7  8             StringBuilder sb = new StringBuilder(); 9             string boundary = "----------------" + DateTime.Now.Ticks.ToString("x");  // 边界符10 11             HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);   // 由于HttpWebRequest没有提供属性来方便传参,所以下面我们只能自己模拟传参12             httpWebRequest.ContentType = "multipart/form-data; boundary=" + boundary; // 声明数据类型13             httpWebRequest.Method = "POST";14             httpWebRequest.KeepAlive = true;15             httpWebRequest.Credentials = System.Net.CredentialCache.DefaultCredentials;16 17             Stream memStream = new System.IO.MemoryStream();18 19             string formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}"; // key就是{0},value是{1}20             foreach (string key in nvc.Keys)21             {22                 string formitem = string.Format(formdataTemplate, key, nvc[key]);23                 sb.Append(formitem);24                 byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);25                 memStream.Write(formitembytes, 0, formitembytes.Length);26             }27             28             // 这里key是{0},value是{1}29             string headerTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n";30 31             // 逐个将文件内容写入流32             for (int i = 0; i < files.Length; i++)33             {34                 FileInfo fi = new FileInfo(files[i]);35 36                 // 写入文件开始标记37                 string header = string.Format(headerTemplate, "file", fi.Name);38                 sb.Append(header);39                 byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);40                 memStream.Write(headerbytes, 0, headerbytes.Length);41 42                 FileStream fileStream = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read);43 44                 byte[] buffer = new byte[1024 * 8];//每次上传8M45 46                 int bytesRead = 0;47                 // 写入文件内容48                 while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)49                 {50                     memStream.Write(buffer, 0, bytesRead);51                 }52                 fileStream.Close();53             }54             sb.Append("\r\n--" + boundary + "--\r\n");55             // 将结束标记写入内存流56             byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");57             memStream.Write(boundarybytes, 0, boundarybytes.Length);58 59             httpWebRequest.ContentLength = memStream.Length;//流总大小60 61             Stream requestStream = httpWebRequest.GetRequestStream();62 63             memStream.Position = 0;64             byte[] tempBuffer = new byte[memStream.Length];65             memStream.Read(tempBuffer, 0, tempBuffer.Length);66             memStream.Close();67             requestStream.Write(tempBuffer, 0, tempBuffer.Length);68             requestStream.Close();69 70             WebResponse webResponse = httpWebRequest.GetResponse();71             Stream stream = webResponse.GetResponseStream();72             StreamReader reader = new StreamReader(stream);73             string ret = reader.ReadToEnd();74 75             return ret;
View Code

  

  2、后台代码:(这里是借鉴bire)你写的代码,稍作修改了下)

1 //获得磁盘文件条目工厂 2         DiskFileItemFactory factory = new DiskFileItemFactory(); 3         //获取文件需要上传到的路径 4         String path = request.getRealPath("/upload"); 5           6         //如果没以下两行设置的话,上传大的 文件 会占用 很多内存, 7         //设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同 8         /** 9          * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 10          * 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的 11          * 然后再将其真正写到 对应目录的硬盘上12          */13         factory.setRepository(new File(path));14         //设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室15         factory.setSizeThreshold(1024*1024) ;16          17         //高水平的API文件上传处理18         ServletFileUpload upload = new ServletFileUpload(factory);19          20          21         try {22             //可以上传多个文件23             List
list = (List
)upload.parseRequest(request);24 25 for(FileItem item : list)26 {27 //获取表单的属性名字28 String name = item.getFieldName();29 30 //如果获取的 表单信息是普通的 文本 信息31 if(item.isFormField())32 { 33 //获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的34 String value = item.getString() ;35 36 request.setAttribute(name, value);37 }38 //对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些39 else40 {41 /**42 * 以下三步,主要获取 上传文件的名字43 */44 //获取路径名45 String value = item.getName() ;46 //索引到最后一个反斜杠47 int start = value.lastIndexOf("\\");48 //截取 上传文件的 字符串名字,加1是 去掉反斜杠,49 String filename = value.substring(start+1);50 51 request.setAttribute(name, filename);52 53 //真正写到磁盘上54 //它抛出的异常 用exception 捕捉55 56 //item.write( new File(path,filename) );//第三方提供的57 58 //手动写的59 OutputStream out = new FileOutputStream(new File(path,filename));60 61 InputStream in = item.getInputStream() ;62 63 int length = 0 ;64 byte [] buf = new byte[1024] ;65 66 System.out.println("获取上传文件的总共的容量:"+item.getSize());67 68 // in.read(buf) 每次读到的数据存放在 buf 数组中69 while( (length = in.read(buf) ) != -1)70 {71 //在 buf 数组中 取出数据 写到 (输出流)磁盘上72 out.write(buf, 0, length);73 74 }75 76 in.close();77 out.close();78 79 // 将上传后的文件信息保存到表t_template_style80 TemplateStyle templateStyle = new TemplateStyle();81 templateStyle.setFilePath(path+"\\"+filename);82 templateStyle.setTemplateId(Integer.parseInt(request.getAttribute("templateId").toString()));83 templateStyleService.save(templateStyle);84 85 }86 }87 88 return null;89 90 }catch (Exception e) {91 resString = "error";92 e.printStackTrace();93 return null;94 }finally{95 response.getWriter().write(resString);96 }
View Code

 

转载于:https://www.cnblogs.com/luoyaqi/p/4881399.html

你可能感兴趣的文章
Competing Consumers Pattern (竞争消费者模式)
查看>>
HDUOJ ------1398
查看>>
cf--------(div1)1A. Theatre Square
查看>>
Android面试收集录15 Android Bitmap压缩策略
查看>>
Tomcat 报错的解决方法:The APR based Apache Tomcat Native library which allows optimal
查看>>
最长公共子串问题(LCS)
查看>>
TortoiseSVN is locked in another working copy
查看>>
PHP魔术方法之__call与__callStatic方法
查看>>
ubuntu 安装后的配置
查看>>
Html学习_简易个人网页制作
查看>>
angular中ng-bind指令小案例
查看>>
jqery总结
查看>>
Lodop获取客户端主网卡ip地址是0.0.0.0
查看>>
VSCODE更改文件时,提示:EACCES: permission denied的解决办法(mac电脑系统)
查看>>
web前端之路,js的一些好书(摘自聂微东 )
查看>>
【模板】对拍程序
查看>>
微信小程序开发初体验
查看>>
dos批处理(bat)运行exe
查看>>
关键字
查看>>
Pycharm安装Markdown插件
查看>>