需求: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;
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 }