c# WebApi POST请求同时包含数据及其文件

  原因:创建.net WebApi的接口API。IIS作为服务端。安卓作为客户端发送json文件及其文件。

             Android端使用xUtils3.0实现文件上传

  java代码:

//要传递给服务器的json格式参数
JSONObject json = new JSONObject();
        try {
            json.put("devId", id);
            json.put("devName", devName);
            json.put("keyWord", keyWord);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        //构建RequestParams对象,传入请求的服务器地址URL
        RequestParams params = new RequestParams(Constants.UPLOAD_FILE);
        params.setAsJsonContent(true);
        List<KeyValue> list = new ArrayList<>();
        list.add(new KeyValue("file", new File(filePah)));
        list.add(new KeyValue("parameters", json.toString()));
        MultipartBody body = new MultipartBody(list, "UTF-8");
        params.setRequestBody(body);
        x.http().post(params, new org.xutils.common.Callback.CommonCallback<String>() {
            @Override
            public void onSuccess(String result) {
                LogUtil.e("请求结果:" + result);
            }

            @Override
            public void onFinished() {
                //上传完成
            }

            @Override
            public void onCancelled(CancelledException cex) {
            //取消上传
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
            //上传失败
                LogUtil.e("请求失败:" + ex.toString());

            }
        });

.net WebApi代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Data.Entity;
using Newtonsoft.Json;
using System.Configuration;

namespace AndroidWebAPI.Controllers
{
    public class AddInfoController : ApiController
    {
               public IEnumerable<string> PostAddInfo()
        {
                 
     
            if (!Request.Content.IsMimeMultipartContent("form-data"))
            {                
                return "请求内容不是表单形式";            
            }         
            if (HttpContext.Current.Request.Files.Count >0)
            {
                try
                {
                    
                    var file = HttpContext.Current.Request.Files[0];     
                    string fname = DateTime.Now.ToString("yyyyMMddHHmmssfff") + file.FileName;
                  
                    string SavePath = HttpContext.Current.Server.MapPath(string.Format("~/{0}", "File"));
                   
                    if (Directory.Exists(SavePath))
                    {
                        Directory.CreateDirectory(SavePath);
                    }            
                    string fullPathUrl = Path.Combine(SavePath, fname);                  
                    file.SaveAs(fullPathUrl);
                    videoFileName = fname;
                }
                catch (Exception ex)
                {                         
                }
            }
                  
            return PBimLogic.AddProblemListInfo(Plm, videoFileName);           
          
        }




    }
}

c# 创建控制台模拟表单上传数据与文件.

创建HttpUpload类

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;

namespace HttpTest
{
    public class HttpUpload
    {
        private ArrayList bytesArray;
        private Encoding encoding = Encoding.UTF8;
        private string boundary = String.Empty;

        public HttpUpload()
        {
            bytesArray = new ArrayList();
            string flag = DateTime.Now.Ticks.ToString("x");
            boundary = "---------------------------" + flag;
        }

        /// <summary>
        /// 合并请求数据
        /// </summary>
        /// <returns></returns>
        private byte[] MergeContent()
        {
            int length = 0;
            int readLength = 0;
            string endBoundary = "--" + boundary + "--\r\n";
            byte[] endBoundaryBytes = encoding.GetBytes(endBoundary);

            bytesArray.Add(endBoundaryBytes);

            foreach (byte[] b in bytesArray)
            {
                length += b.Length;
            }

            byte[] bytes = new byte[length];

            foreach (byte[] b in bytesArray)
            {
                b.CopyTo(bytes, readLength);
                readLength += b.Length;
            }

            return bytes;
        }

        /// <summary>
        /// 上传
        /// </summary>
        /// <param name="requestUrl">请求url</param>
        /// <param name="responseText">响应</param>
        /// <returns></returns>
        public bool Upload(String requestUrl, out String responseText)
        {
            WebClient webClient = new WebClient();
            webClient.Headers.Add("Content-Type", "multipart/form-data; boundary=" + boundary);

            byte[] responseBytes;
            byte[] bytes = MergeContent();

            try
            {
                responseBytes = webClient.UploadData(requestUrl, bytes);
                responseText = System.Text.Encoding.UTF8.GetString(responseBytes);
                return true;
            }
            catch (WebException ex)
            {
                Stream responseStream = ex.Response.GetResponseStream();
                responseBytes = new byte[ex.Response.ContentLength];
                responseStream.Read(responseBytes, 0, responseBytes.Length);
            }
            responseText = System.Text.Encoding.UTF8.GetString(responseBytes);
            return false;
        }

        /// <summary>
        /// 设置表单数据字段
        /// </summary>
        /// <param name="fieldName">字段名</param>
        /// <param name="fieldValue">字段值</param>
        /// <returns></returns>
        public void SetFieldValue(String fieldName, String fieldValue)
        {
            string httpRow = "--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\r\n";
            string httpRowData = String.Format(httpRow, fieldName, fieldValue);

            bytesArray.Add(encoding.GetBytes(httpRowData));
        }

        /// <summary>
        /// 设置表单文件数据
        /// </summary>
        /// <param name="fieldName">字段名</param>
        /// <param name="filename">字段值</param>
        /// <param name="contentType">内容内型</param>
        /// <param name="fileBytes">文件字节流</param>
        /// <returns></returns>
        public void SetFieldValue(String fieldName, String filename, String contentType, Byte[] fileBytes)
        {
            string end = "\r\n";
            string httpRow = "--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
            string httpRowData = String.Format(httpRow, fieldName, filename, contentType);

            byte[] headerBytes = encoding.GetBytes(httpRowData);
            byte[] endBytes = encoding.GetBytes(end);
            byte[] fileDataBytes = new byte[headerBytes.Length + fileBytes.Length + endBytes.Length];

            headerBytes.CopyTo(fileDataBytes, 0);
            fileBytes.CopyTo(fileDataBytes, headerBytes.Length);
            endBytes.CopyTo(fileDataBytes, headerBytes.Length + fileBytes.Length);

            bytesArray.Add(fileDataBytes);
        }
    }
}

控制台调用:

using System;
using System.IO;
using System.Text;

namespace HttpTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            try
            {
                var httpUpload = new HttpUpload();
                string txtJsonData= File.ReadAllText(@"D:\Test\HttpTest\HttpTest\HttpTest\JsonData.txt", Encoding.UTF8);
                httpUpload.SetFieldValue("parameters", txtJsonData);
         
                string path = @"D:\Test\HttpTest\HttpTest\HttpTest\Test.txt";
                FileStream fspdf = new FileStream(path, FileMode.Open);
                byte[] fileBytepdf = new byte[fspdf.Length];
                fspdf.Read(fileBytepdf, 0, fileBytepdf.Length);
                fspdf.Close();
                var pdfName = path.Substring(path.LastIndexOf("\\") + 1);
                httpUpload.SetFieldValue(pdfName, pdfName, "application/octet-stream", fileBytepdf);
                string responStr = "";
                //string _apiUrl = @"http://localhost:51013/api/AddInfo";
                string _apiUrl = @"http://192.168.2.1:10000//api/AddInfo";
                bool suc = httpUpload.Upload(_apiUrl, out responStr);
            }
            catch (Exception ex)
            {

                throw ex; 
            }

            Console.ReadLine();
        }
    }
}

 

posted @ 2018-05-15 17:59  阿文sky  阅读(9281)  评论(0编辑  收藏  举报