表单数据类 (为WebRequest提供数据)

本文介绍了一个.NET中的自定义类库,用于构建HTTP请求的内容部分,包括表单数据和URL参数。该类库提供了灵活的方法来处理文件上传和普通字段,并支持生成标准的multipart/form-data格式。

RequestContent.cs

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;

namespace PortrayUploader
{
    public class RequestContent
    {
        private long _timeTicks;
        private RequestFieldCollection _fields;

        #region Properties
        public long TimeTicks
        {
            get
            {
                return _timeTicks;
            }
            set
            {
                _timeTicks = value;
            }
        }

        public RequestFieldCollection Fields
        {
            get
            {
                if(_fields == null)
                {
                    _fields = new RequestFieldCollection();
                }

                return _fields;
            }
            set
            {
                _fields = value;
            }
        }
        #endregion

        #region RequestContent
        public RequestContent()
        {
        }

        public RequestContent(long timeTicks, RequestFieldCollection fields)
        {
            _timeTicks = timeTicks;
            _fields = fields;
        } 
        #endregion

        #region GetFormData
        public byte[] GetFormData()
        {
            List<byte> buffer = new List<byte>();
            RequestField field;
            byte[] buffer1 = Encoding.Default.GetBytes(string.Format("-----------------------{0:X}/r/n", _timeTicks));

            foreach(RequestField f in _fields)
            {
                buffer.AddRange(buffer1);
                field = f;
                buffer.AddRange(f.GetFormData());
            }

            buffer1 = Encoding.Default.GetBytes(string.Format("-----------------------{0:X}--/r/n", _timeTicks));
            buffer.AddRange(buffer1);
            return buffer.ToArray();
        } 
        #endregion

        #region GetFormUrl
        public byte[] GetFormUrl()
        {
            RequestField field;
            StringBuilder sb = new StringBuilder();

            foreach(RequestField f in _fields)
            {
                field = f;
                sb.Append(f.GetFormUrl());
                sb.Append('&');
            }

            if(sb.Length > 1)
            {
                sb.Remove(sb.Length - 1, 1);
            }

            return Encoding.Default.GetBytes(sb.ToString());
        } 
        #endregion
    }
}

RequestField

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

namespace PortrayUploader
{
    public class RequestField
    {
        private bool _isFile;
        private string _name;
        private string _value;

        #region Properties
        public bool IsFile
        {
            get
            {
                return _isFile;
            }
            set
            {
                _isFile = value;
            }
        }

        public string Name
        {
            get
            {
                return _name;
            }
            set
            {
                _name = value;
            }
        }

        public string Value
        {
            get
            {
                return _value;
            }
            set
            {
                _value = value;
            }
        }
        #endregion

        #region RequestField
        public RequestField()
        {
        }

        public RequestField(bool isFile, string name, string value)
        {
            _isFile = isFile;
            _name = name;
            _value = value;
        } 
        #endregion

        #region GetFormData
        public byte[] GetFormData()
        {
            byte[] data;
            byte[] buffer1;
            byte[] buffer2;
            string bufferStr;

            if(IsFile)
            {
                bufferStr = string.Format("Content-Disposition: form-data; name=/"{0}/"; filename=/"{1}/"/r/nContent-Type: application/octet-stream/r/n/r/n", _name, Path.GetFileName(_value));

                using(FileStream fs = new FileStream(_value, FileMode.Open, FileAccess.Read))
                {
                    using(BinaryReader br = new BinaryReader(fs))
                    {
                        buffer2 = br.ReadBytes((int)br.BaseStream.Length);
                    }
                }
            }
            else
            {
                bufferStr = string.Format("Content-Disposition: form-data; name=/"{0}/"", _name);
                buffer2 = Encoding.Default.GetBytes(_value);
            }

            buffer1 = Encoding.Default.GetBytes(bufferStr);
            data = new byte[buffer1.Length + buffer2.Length + 2];
            buffer1.CopyTo(data, 0);
            buffer2.CopyTo(data, buffer1.Length);
            Encoding.Default.GetBytes("/r/n").CopyTo(data, buffer1.Length + buffer2.Length);
            return data;
        } 
        #endregion

        #region GetFormUrl
        public string GetFormUrl()
        {
            return string.Format("{0}={1}", HttpUtility.UrlEncode(_name), HttpUtility.UrlEncode(_value));
        } 
        #endregion
    }
}

RequestFieldCollection.cs

using System;
using System.Collections;
using System.Text;

namespace PortrayUploader
{
    public class RequestFieldCollection : IList, ICollection, IEnumerable
    {
        private ArrayList requestFields;

        public RequestFieldCollection()
        {
            this.requestFields = new ArrayList();
        }

        #region IList 成员

        #region Add
        public void Add(bool isFile, string name, string value)
        {
            this.Add(new RequestField(isFile, name, value));
        }

        public void Add(RequestField field)
        {
            this.requestFields.Add(field);
        } 
        #endregion

        #region AddRange
        public void AddRange(RequestField[] fields)
        {
            if(fields == null)
            {
                throw new ArgumentException("fields");
            }

            foreach(RequestField field in fields)
            {
                this.Add(field);
            }
        } 
        #endregion

        #region Clear
        public void Clear()
        {
            this.requestFields.Clear();
        } 
        #endregion

        #region Contains
        public bool Contains(RequestField field)
        {
            return this.requestFields.Contains(field);
        } 
        #endregion

        #region IndexOf
        public int IndexOf(RequestField field)
        {
            return this.requestFields.IndexOf(field);
        } 
        #endregion

        #region Insert
        public void Insert(int index, RequestField field)
        {
            this.requestFields.Insert(index, field);
        } 
        #endregion

        #region InsertRange
        public void InsertRange(int index, RequestField[] fields)
        {
            if(fields == null)
            {
                throw new ArgumentException("fields");
            }

            foreach(RequestField field in fields)
            {
                this.Insert(index, field);
            }
        } 
        #endregion

        #region IsFixedSize
        public bool IsFixedSize
        {
            get
            {
                return this.requestFields.IsFixedSize;
            }
        } 
        #endregion

        #region IsReadOnly
        public bool IsReadOnly
        {
            get
            {
                return this.requestFields.IsReadOnly;
            }
        } 
        #endregion

        #region Remove
        public void Remove(RequestField field)
        {
            this.requestFields.Remove(field);
        } 
        #endregion

        #region RemoveAt
        public void RemoveAt(int index)
        {
            this.requestFields.RemoveAt(index);
        } 
        #endregion

        #region RequestField[]
        public RequestField this[int index]
        {
            get
            {
                return (RequestField)this.requestFields[index];
            }
            set
            {
                this.requestFields[index] = (RequestField)value;
            }
        }

        public RequestField this[string name]
        {
            get
            {
                int index = this.FindByName(name);

                if(index >= 0)
                {
                    return this[index];
                }

                return null;
            }
            set
            {
                if(name == null)
                {
                    throw new ArgumentNullException("name");
                }

                int index = this.FindByName(name);

                if(index >= 0)
                {
                    this[index] = (RequestField)value;
                }
                else
                {
                    this.Add((RequestField)value);
                }
            }
        }
        #endregion

        #region internal RequestField
        internal int FindByName(string name)
        {
            foreach(RequestField field in this.requestFields)
            {
                if(field.Name == name)
                {
                    return this.IndexOf(field);
                }
            }

            return -1;
        } 
        #endregion

        #endregion

        #region ICollection 成员

        #region CopyTo
        void ICollection.CopyTo(Array array, int index)
        {
            this.requestFields.CopyTo(array, index);
        } 
        #endregion

        #region Count
        int ICollection.Count
        {
            get
            {
                return this.requestFields.Count;
            }
        } 
        #endregion

        #region IsSynchronized
        bool ICollection.IsSynchronized
        {
            get
            {
                return this.requestFields.IsSynchronized;
            }
        } 
        #endregion

        #region SyncRoot
        object ICollection.SyncRoot
        {
            get
            {
                return this.requestFields.SyncRoot;
            }
        } 
        #endregion

        #endregion

        #region IEnumerable 成员

        #region GetEnumerator
        public IEnumerator GetEnumerator()
        {
            return this.requestFields.GetEnumerator();
        } 
        #endregion

        #endregion

        #region IList Members

        int IList.Add(object field)
        {
            return this.requestFields.Add((RequestField)field);
        }

        bool IList.Contains(object field)
        {
            return this.Contains((RequestField)field);
        }

        int IList.IndexOf(object field)
        {
            return this.IndexOf((RequestField)field);
        }

        void IList.Insert(int index, object field)
        {
            this.Insert(index, (RequestField)field);
        }

        bool IList.IsFixedSize
        {
            get
            {
                return this.IsFixedSize;
            }
        }

        bool IList.IsReadOnly
        {
            get
            {
                return this.IsReadOnly;
            }
        }

        void IList.Remove(object field)
        {
            this.Remove((RequestField)field);
        }

        void IList.RemoveAt(int index)
        {
            this.RemoveAt(index);
        }

        object IList.this[int index]
        {
            get
            {
                return this[index];
            }
            set
            {
                this[index] = (RequestField)value;
            }
        }

        #endregion
    }
}
### 在 Unity 中使用 UnityWebRequest 通过表单数据上传图片并获取返回的网页链接 要在 Unity 中使用 `UnityWebRequest` 实现通过表单数据上传图片的功能,并从服务器端接收返回的网页链接,可以按照以下方式进行操作。此过程涉及创建一个包含图片文件的表单 (`WWWForm`) 并将其发送到指定 URL。 以下是完整的代码实现: ```csharp using System.IO; using UnityEngine; using UnityEngine.Networking; public class ImageUploadExample : MonoBehaviour { public string serverUrl; // 图片上传的目标URL public string imagePath; // 本地图片路径 void Start() { UploadImageUsingForm(); } private void UploadImageUsingForm() { if (!File.Exists(imagePath)) { Debug.LogError("图片不存在:" + imagePath); return; } byte[] imageData = File.ReadAllBytes(imagePath); if (imageData == null || imageData.Length == 0) { Debug.LogError("无法读取图片数据!"); return; } StartCoroutine(UploadCoroutine(imageData)); } IEnumerator UploadCoroutine(byte[] imageData) { WWWForm form = new WWWForm(); form.AddBinaryData("file", imageData, Path.GetFileName(imagePath), "image/jpeg"); // 设置MIME类型 using (UnityWebRequest www = UnityWebRequest.Post(serverUrl, form)) { yield return www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { Debug.LogError("上传失败:" + www.error); } else { // 假设服务器返回了一个JSON字符串,其中包含了图片的网络链接 string jsonResponse = www.downloadHandler.text; // 解析JSON响应(假设返回字段名为"imageUrl") var imageUrl = ParseImageUrlFromJson(jsonResponse); Debug.Log("图片上传成功,返回的链接为:" + imageUrl); } } } private string ParseImageUrlFromJson(string json) { // 示例解析逻辑,具体取决于服务器返回的数据结构 // 假设返回格式如下:{"status":"success","data":{"imageUrl":"http://example.com/image.jpg"}} try { var jsonObject = MiniJson.JsonDecode(json) as System.Collections.IDictionary; var dataDict = jsonObject["data"] as System.Collections.IDictionary; return dataDict["imageUrl"].ToString(); } catch (System.Exception e) { Debug.LogError("JSON解析错误:" + e.Message); return ""; } } } ``` #### 关于代码说明 1. **图片加载与转换** 使用 `File.ReadAllBytes()` 方法将本地图片文件读取为字节数组[^1]。这一步确保了图片能够被正确序列化为二进制形式用于后续传输。 2. **构建表单数据** 利用 `WWWForm` 类来封装待上传的数据。调用其成员函数 `AddBinaryData()` 可以方便地附加二进制类型的字段(如图片)。注意设置 MIME 类型以匹配目标服务的要求[^2]。 3. **发起 POST 请求** 创建一个新的 `UnityWebRequest` 对象实例表示即将执行的操作类型(这里是 HTTP POST),并将准备好的表单赋值给它的属性 `uploadHandler` 和其他必要头信息一起提交出去等待结果反馈回来再做进一步处理即可完成整个流程[^3]。 4. **处理响应数据** 成功接收到回复之后通常会得到一段文本描述或者 JSON 格式的串流内容;这里简单示范了一下如何提取出感兴趣部分即最终形成的公开可访问地址供客户端展示用途等等场景下适用。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值