• java调用c#webapi的接口实现文件上传


    因为工作的需要,需要用java调c#写好的webapi接口来实现跨语言的文件的传输,话不多说,直接上代码

    一:Java的代码(相当于客户端):

      

    import java.io.File;
    import java.io.IOException;
    import java.nio.charset.Charset;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;
    
    import org.apache.http.Consts;
    import org.apache.http.HttpEntity;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.ContentType;
    import org.apache.http.entity.mime.MultipartEntityBuilder;
    import org.apache.http.entity.mime.content.FileBody;
    import org.apache.http.entity.mime.content.StringBody;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
    //import org.slf4j.Logger;
    //import org.slf4j.LoggerFactory;
    public class http {
    public static Map<String,Object> uploadFileByHTTP(File postFile,String postUrl,Map<String,String> postParam){
    //Logger log = LoggerFactory.getLogger(UploadTest.class);

    Map<String,Object> resultMap = new HashMap<String,Object>();
    CloseableHttpClient httpClient = HttpClients.createDefault();
    try{
    //把一个普通参数和文件上传给下面这个地址 是一个servlet
    HttpPost httpPost = new HttpPost(postUrl);
    //把文件转换成流对象FileBody
    FileBody fundFileBin = new FileBody(postFile);
    //设置传输参数
    MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create();
    //multipartEntity.setCharset(Charset.forName("GB2312"));
    //multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    String fileCode=(String)System.getProperties().get("file.encoding");
    String filename = postFile.getName();
    //filename= new String (filename.getBytes(fileCode),fileCode);
    String name=gbEncoding(filename); //需要将文件名unicode来传送,以防乱码
    multipartEntity.addPart(name, fundFileBin);
    //multipartEntity.addPart(postFile.getName(), fundFileBin);//相当于<input type="file" name="media"/>//multipartEntity.addPart(postFile.getName(), fundFileBin);//相当于<input type="file" name="media"/>

    //设计文件以外的参数
    Set<String> keySet = postParam.keySet();
    for (String key : keySet) {
    //相当于<input type="text" name="name" value=name>
    multipartEntity.addPart(key, new StringBody(postParam.get(key), ContentType.create("application/json", Consts.UTF_8)));//application/json
    }

    HttpEntity reqEntity = multipartEntity.build();

    httpPost.setEntity(reqEntity);

    //log.info("发起请求的页面地址 " + httpPost.getRequestLine());
    //发起请求 并返回请求的响应
    CloseableHttpResponse response = httpClient.execute(httpPost);
    try {
    ///log.info("----------------------------------------");
    //打印响应状态
    //log.info(response.getStatusLine());
    resultMap.put("statusCode", response.getStatusLine().getStatusCode());
    //获取响应对象
    HttpEntity resEntity = response.getEntity();
    if (resEntity != null) {
    //打印响应长度
    //log.info("Response content length: " + resEntity.getContentLength());
    //打印响应内容
    resultMap.put("data", EntityUtils.toString(resEntity,Charset.forName("UTF-8")));
    }
    //销毁
    EntityUtils.consume(resEntity);
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    response.close();
    }
    } catch (ClientProtocolException e1) {
    e1.printStackTrace();
    } catch (IOException e1) {
    e1.printStackTrace();
    } finally{
    try {
    httpClient.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    //log.info("uploadFileByHTTP result:"+resultMap);
    return resultMap;
    }



    public static String gbEncoding(final String gbString) { //将中文转unicode
    char[] utfBytes = gbString.toCharArray();
    String unicodeBytes = "";
    for (int i = 0; i < utfBytes.length; i++) {
    String hexB = Integer.toHexString(utfBytes[i]);
    if (hexB.length() <= 2) {
    hexB = "00" + hexB;
    }
    unicodeBytes = unicodeBytes + "\u" + hexB;
    }
    return unicodeBytes;
    }

    //测试
    public static void main(String args[]) throws Exception {
    //要上传的文件的路径
    String filePath = "C:\Users\LYY\Desktop\xml\自动化生产线2.xml";
    String postUrl = "http://localhost:8081/api/Trading/Files/Test"; //服务器的路径
    Map<String,String> postParam = new HashMap<String,String>();
    postParam.put("methodsName", "Saw");
    postParam.put("serverPath", "Saw");
    postParam.put("ArtifactsNum", "0");
    postParam.put("userName", "finchina");
    postParam.put("guidStr", "7b2c7a31-ca59-46c5-9290-6b4303498e5e");
    postParam.put("routeUrl", "http://120.76.96.61:8085/");

    File postFile = new File(filePath);
    Map<String,Object> resultMap = uploadFileByHTTP(postFile,postUrl,postParam);
    System.out.println(resultMap);
    }
    }
    
    

    二:c#的webapi的接口代码(服务端):文件的接收

      


          
     //将unicode转为中文
            public static string Unicode2String(string source)
            {
                return new Regex(@"\u([0-9A-F]{4})", RegexOptions.IgnoreCase | RegexOptions.Compiled).Replace(
                    source, x => string.Empty + Convert.ToChar(Convert.ToUInt16(x.Result("$1"), 16)));
            }
            [HttpPost]
            public IHttpActionResult AcceptPost()
            {
              
                string result = "";
                string url = "";
                List<Stream> listStream = new List<Stream>();
                List<byte[]> listContentByte = new List<byte[]>();
                List<string> listFileName = new List<string>();           
                string methodsName = System.Web.HttpContext.Current.Request.Form["methodsName"];
                string serverPath = System.Web.HttpContext.Current.Request.Form["serverPath"];
                string ArtifactsNum = System.Web.HttpContext.Current.Request.Form["ArtifactsNum"];
                string userName = System.Web.HttpContext.Current.Request.Form["userName"];
                string guidStr = System.Web.HttpContext.Current.Request.Form["guidStr"];
                string routeUrl = System.Web.HttpContext.Current.Request.Form["routeUrl"];
                FilesType filesType = FilesType.General;
                HttpFileCollection Files = HttpContext.Current.Request.Files;
                string[] allkeys = Files.AllKeys;
                for (int i = 0; i < allkeys.Length; i++)
                {
                    string filekey = allkeys[i];
                    string name = Unicode2String(filekey);
                    string[] namearr = name.Split(new char[] { '\' }, StringSplitOptions.RemoveEmptyEntries);
                    string filename = string.Join("", namearr);
                    listFileName.Add(filename);
                }
                HttpContext context = HttpContext.Current;
                for (int i = 0; i < context.Request.Files.Count; i++)
                {
                    try
                    {
                        HttpPostedFile aFile = context.Request.Files[i];
                        Stream mystream = aFile.InputStream;
                        StreamReader reader = new StreamReader(mystream);
                        string xml = " ";
                        StringBuilder strXML = new StringBuilder();
                        while (reader.Peek() >= 0)
                        {
                            string line = reader.ReadLine().Trim();//直接读取一行
                            if (line == null) return null;
                            if (line == String.Empty) continue;
                            if (line.StartsWith("<"))
                            {
                                xml = line.Trim();
                                strXML.Append(xml);
                            }
                        }
                        String xmlData = reader.ReadToEnd();
                        byte[] bytes = System.Text.Encoding.UTF8.GetBytes(strXML.ToString());
                        listContentByte.Add(bytes);
                    }
                    catch
                    {
                    }
                }
                //接收传递过来的数据流
                /*Stream stream = System.Web.HttpContext.Current.Request.InputStream;
                StreamReader reader = new StreamReader(stream);       
                string xml = " ";
                StringBuilder strXML = new StringBuilder();
                string[] heads = HttpContext.Current.Request.Headers.AllKeys;
                string headvalues = HttpContext.Current.Request.Headers.ToString();
                while (reader.Peek() >= 0)
                {
                    string line = reader.ReadLine().Trim();//直接读取一行
                    if (line == null) return null;
                    if (line == String.Empty) continue;
                    if (line.StartsWith("<"))
                    {
                        xml = line.Trim();
                        strXML.Append(xml);
                    }
                }
                String xmlData = reader.ReadToEnd();         
                byte[] bytes = System.Text.Encoding.UTF8.GetBytes(strXML.ToString());          
                listContentByte.Add(bytes); */
                using (HttpClient client = new HttpClient())
                {
                    Dictionary<string, string> DicData = new Dictionary<string, string>();
                    DicData.Add("MethodName", methodsName);
                    DicData.Add("ServerPath", serverPath);
                    DicData.Add("ArtifactsNum", ArtifactsNum.ToString());
                    DicData.Add("SendTime", DateTime.Now.ToString());
                    DicData.Add("UserName", userName);
                    DicData.Add("FileType", filesType.ToString());
                    DicData.Add("FileGuid", guidStr);
                    client.MaxResponseContentBufferSize = 2147483647;
                    client.Timeout = TimeSpan.FromMinutes(30);
                    MediaTypeWithQualityHeaderValue temp = new MediaTypeWithQualityHeaderValue("application/json") { CharSet = "utf-8" };
                    client.DefaultRequestHeaders.Accept.Add(temp);//设定要响应的数据格式
                    using (var content = new MultipartFormDataContent())//表明是通过multipart/form-data的方式上传数据
                    {
                        var formDatas = this.GetFormDataByteArrayContent(this.GetNameValueCollection(DicData));//获取键值集合对应
                        var files = this.GetFileByteArray(listContentByte, listFileName);//获取文件集合对应的ByteArrayContent集合
                        Action<List<ByteArrayContent>> act = (dataContents) =>
                        {//声明一个委托,该委托的作用就是将ByteArrayContent集合加入到MultipartFormDataContent中
                            foreach (var byteArrayContent in dataContents)
                            {
                                content.Add(byteArrayContent);
                            }
                        };
                        act(formDatas);
                        act(files);//执行act
                        try
                        {
                            url = string.Format(routeUrl + "api/Trading/Files/UploadOptimizeFile");
                            var returnResult = client.PostAsync(url, content).Result;//post请求  
                            if (returnResult.StatusCode == HttpStatusCode.OK)
                                result = returnResult.Content.ReadAsAsync<string>().Result;
                            else
                                result = "30|客户端连接路由端出错,错误代码:" + returnResult.StatusCode.ToString();
                        }
                        catch (Exception ex)
                        {
                            result = "29|客户端连接超时";
                        }
                    }
                }
                return Ok(result);
            }
            /// <summary>
            /// 转换成ByteArrayContent列表
            /// </summary>
            /// <param name="listByte">字节数组列表</param>
            /// <param name="listName">对应字节数组的文件名</param>
            /// <returns></returns>
            private List<ByteArrayContent> GetFileByteArray(List<byte[]> listByte, List<string> listName)
            {
                List<ByteArrayContent> list = new List<ByteArrayContent>();
                if (listByte != null && listName != null)
                {
                    for (int i = 0; i < listByte.Count; i++)
                    {
                        var fileContent = new ByteArrayContent(listByte[i]);
                        fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                        {
                            FileName = listName[i]
                        };
                        list.Add(fileContent);
                    }
                }
                return list;
            }
  • 相关阅读:
    ASP.NET在MVC控制器中获取Form表单值的方法
    MVC中几种常用ActionResult
    EF 配置MySQL
    HTTP 错误 403.6
    26个Jquery使用小技巧(转)
    Win2008R2配置WebDeploy(转)
    IIS快捷方式
    发布你的程序包到Nuget
    PostgreSQL recovery.conf恢复配置
    PostgreSQL 9.5 高可用、负载均衡和复制
  • 原文地址:https://www.cnblogs.com/zhouyuqiu/p/12084605.html
Copyright © 2020-2023  润新知