前端使用c# winform創建客戶端來進行post發送文件,后台使用java來接收


需求: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];//每次上傳8M
45 
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<FileItem> list = (List<FileItem>)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                 else
40                 {
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_style
80                     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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM