C# post表單上傳文件到java spring 服務

C#端代碼:來自網絡,驗證可用

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                var javaurl = "http://localhost:8083/xx_manager_war_exploded/api/project/upload?token=xxxxxxx";
                var filepath = "F:\\新建文本文檔.txt";//文件路徑
                var filename = filepath.Substring(filepath.LastIndexOf("\\") + 1);//文件名稱
                //var javaurl = string.Format("http://{0}:8081/file/uploadVoice", AndroidIP);

                var httpUpload = new HttpUpload();
                var path1 = filepath;
                var formDatas = new List<FormItemModel>();
                //添加文件
                formDatas.Add(new FormItemModel()
                {
                    Key = "file",
                    Value = "",
                    FileName = filename,
                    FileContent = File.OpenRead(path1)
                });
                formDatas.Add(new FormItemModel()
                {
                    Key = "file1",
                    Value = "",
                    FileName = filename,
                    FileContent = File.OpenRead(path1)
                });
                //添加其他字段
                formDatas.Add(new FormItemModel()
                {
                    Key = "projectId",
                    Value = "8a80813d725f426a01725f4956a90096"
                });
                formDatas.Add(new FormItemModel()
                {
                    Key = "dir",
                    Value = "abc\\xyz\\qq"
                });
                //提交表單
                var result = httpUpload.PostForm(javaurl, formDatas);
                if (result == "1")
                {
                    MessageBox.Show("發送成功");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
 
    }
public class HttpUpload
    {
        /// <summary>
        /// 使用Post方法獲取字符串結果
        /// </summary>
        /// <param name="url"></param>
        /// <param name="formItems">Post表單內容</param>
        /// <param name="cookieContainer"></param>
        /// <param name="timeOut">默認20秒</param>
        /// <param name="encoding">響應內容的編碼類型(默認utf-8)</param>
        /// <returns></returns>
        public string PostForm(string url, List<FormItemModel> formItems, CookieContainer cookieContainer = null, string refererUrl = null, Encoding encoding = null, int timeOut = 20000)
        {
            string retString = string.Empty;
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                #region 初始化請求對象
                request.Method = "POST";
                request.Timeout = timeOut;
                request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
                request.KeepAlive = true;
                request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36";
                request.UseDefaultCredentials = true;
                if (!string.IsNullOrEmpty(refererUrl))
                    request.Referer = refererUrl;
                if (cookieContainer != null)
                    request.CookieContainer = cookieContainer;
                #endregion

                string boundary = "----" + DateTime.Now.Ticks.ToString("x");//分隔符
                request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);
                //請求流
                var postStream = new MemoryStream();
                #region 處理Form表單請求內容
                //是否用Form上傳文件
                var formUploadFile = formItems != null && formItems.Count > 0;
                if (formUploadFile)
                {
                    //文件數據模板
                    string fileFormdataTemplate =
                        "\r\n--" + boundary +
                        "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"" +
                        "\r\nContent-Type: text/plain" +
                        "\r\n\r\n";
                    //文本數據模板
                    string dataFormdataTemplate =
                        "\r\n--" + boundary +
                        "\r\nContent-Disposition: form-data; name=\"{0}\"" +
                        "\r\n\r\n{1}";
                    foreach (var item in formItems)
                    {
                        string formdata = null;
                        if (item.IsFile)
                        {
                            //上傳文件
                            formdata = string.Format(
                                fileFormdataTemplate,
                                item.Key, //表單鍵
                                item.FileName);
                        }
                        else
                        {
                            //上傳文本
                            formdata = string.Format(
                                dataFormdataTemplate,
                                item.Key,
                                item.Value);
                        }

                        //統一處理
                        byte[] formdataBytes = null;
                        //第一行不需要換行
                        if (postStream.Length == 0)
                            formdataBytes = Encoding.UTF8.GetBytes(formdata.Substring(2, formdata.Length - 2));
                        else
                            formdataBytes = Encoding.UTF8.GetBytes(formdata);
                        postStream.Write(formdataBytes, 0, formdataBytes.Length);

                        //寫入文件內容
                        if (item.FileContent != null && item.FileContent.Length > 0)
                        {
                            using (var stream = item.FileContent)
                            {
                                byte[] buffer = new byte[1024];
                                int bytesRead = 0;
                                while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0)
                                {
                                    postStream.Write(buffer, 0, bytesRead);
                                }
                            }
                        }
                    }
                    //結尾
                    var footer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
                    postStream.Write(footer, 0, footer.Length);

                }
                else
                {
                    request.ContentType = "application/x-www-form-urlencoded";
                }
                #endregion

                request.ContentLength = postStream.Length;

                #region 輸入二進制流
                if (postStream != null)
                {
                    postStream.Position = 0;
                    //直接寫入流
                    Stream requestStream = request.GetRequestStream();

                    byte[] buffer = new byte[1024];
                    int bytesRead = 0;
                    while ((bytesRead = postStream.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        requestStream.Write(buffer, 0, bytesRead);
                    }

                    ////debug
                    //postStream.Seek(0, SeekOrigin.Begin);
                    //StreamReader sr = new StreamReader(postStream);
                    //var postStr = sr.ReadToEnd();
                    postStream.Close();//關閉文件訪問
                }
                #endregion

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                if (cookieContainer != null)
                {
                    response.Cookies = cookieContainer.GetCookies(response.ResponseUri);
                }

                using (Stream responseStream = response.GetResponseStream())
                {
                    using (StreamReader myStreamReader = new StreamReader(responseStream, encoding ?? Encoding.UTF8))
                    {
                        retString = myStreamReader.ReadToEnd();
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                //Log.e(typeof(HttpUpload), ex.Message);
            }
            return retString;
        }
    }

    /// <summary>
    /// 表單數據項
    /// </summary>
    public class FormItemModel
    {
        /// <summary>
        /// 表單鍵,request["key"]
        /// </summary>
        public string Key { set; get; }
        /// <summary>
        /// 表單值,上傳文件時忽略,request["key"].value
        /// </summary>
        public string Value { set; get; }
        /// <summary>
        /// 是否是文件
        /// </summary>
        public bool IsFile
        {
            get
            {
                if (FileContent == null || FileContent.Length == 0)
                    return false;

                if (FileContent != null && FileContent.Length > 0 && string.IsNullOrWhiteSpace(FileName))
                    throw new Exception("上傳文件時 FileName 屬性值不能爲空");
                return true;
            }
        }
        /// <summary>
        /// 上傳的文件名
        /// </summary>
        public string FileName { set; get; }
        /// <summary>
        /// 上傳的文件內容
        /// </summary>
        public Stream FileContent { set; get; }
    }

java端接收:

@Controller
@RequestMapping(value = "/api/project", name = "項目管理")
public class ApiProjectController {
    @Resource
    private ProjectService service;
    @Resource
    private ApiProjectService apiProjectService;

    @RequestMapping(value = "/upload", name = "上傳")
    @ResponseBody
    public Object upload(ReqModule reqModule) {
        apiProjectService.upload(reqModule);
        return new Result(true);
    }
}
@Data
public class ReqModule {
    private String projectId;
    private String module;
    private String dir;
    private MultipartFile file;
    private MultipartFile file1;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章