は、大きなファイルのために、それはあまりにも多くのオーバーヘッドを追加します。代わりにRFC 2388
に定義されているようにmultipart/form-data
を使用することをお勧めします。ファイルをバイナリストリームとして直接送信できるからです。ほとんどのサーバー側のAPIフレームワークでは、multipart/form-data
エンコードされたリクエストのネイティブサポートがあります。ここでは例のペイロードがあります:
POST /upload HTTP/1.1
Host: example.com
Content-Type: multipart/form-data, boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="file1"; filename="a.txt"
Content-Type: text/plain
contents of a.txt come here
--AaB03x
Content-Disposition: form-data; name="file2"; filename="b.txt"
Content-Type: text/plain
contents of b.txt come here
--AaB03x--
汎用オブジェクトをデシリアライズについてのあなたの2番目の質問については、Json.NETパッケージには、このような状況に対処するためのカスタムJsonConverterを書き込むことができます。デシリアライズするとき今、すべての残っているこのコンバータを使用している
public class MyConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(MyModel);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
{
return null;
}
var json = JObject.Load(reader);
JToken typeToken;
JToken valueToken;
if (json.TryGetValue("type", StringComparison.InvariantCultureIgnoreCase, out typeToken) &&
json.TryGetValue("value", StringComparison.InvariantCultureIgnoreCase, out valueToken))
{
string type = typeToken.Value<string>().ToLowerInvariant();
var model = new MyModel();
model.Type = type;
switch (type)
{
case "float":
model.Value = valueToken.Value<float>();
break;
case "int":
model.Value = valueToken.Value<int>();
break;
case "string":
model.Value = valueToken.Value<string>();
break;
case "bytes":
string input = valueToken.Value<string>();
int count = input.Length/8;
byte[] bytes = new byte[count];
for (int i = 0; i < count; ++i)
{
bytes[i] = Convert.ToByte(input.Substring(8 * i, 8), 2);
}
model.Value = bytes;
break;
default:
throw new NotSupportedException("The specified type is not supported: " + type);
}
return model;
}
return null;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
を::
public class MyModel
{
public object Value { get; set; }
public string Type { get; set; }
}
し、それを処理するためのコンバータを書く:あなたは、あなたのデータをモデル化することによって開始することができます
string json =
@"[{
""value"": 1.2,
""type"": ""float""
}, {
""value"": 1,
""type"": ""int""
}, {
""value"": ""Hello"",
""type"": ""string""
}, {
""value"": ""00011111010101"",
""type"": ""bytes""
}]";
var myConverter = new MyConverter();
var models = JsonConvert.DeserializeObject<IList<MyModel>>(json, myConverter);
使用HTML5ファイルAPI(オプション1)。 –