Здравствуйте.
Пишу HTTP сервер. Файлы передаю вот так:
private void SendFileAsStream(Socket client, string filePath, long byteStart, long byteEnd)
{
try
{
using (Stream stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
stream.Position = byteStart;
if (byteEnd == -1L || byteEnd < byteStart)
{
byteEnd = stream.Length == 0L ? 0 : stream.Length - 1L;
}
long segmentSize = byteStart == byteEnd ? 1L : byteEnd - byteStart + 1;
string fileExt = Path.GetExtension(filePath);
int errorCode = segmentSize == stream.Length ? 200 : 206;
string t = $"HTTP/1.1 {errorCode} OK\r\nContent-Type: {GetContentType(fileExt)}\r\n" +
$"Content-Length: {segmentSize}\r\naccept-range: bytes\r\n\r\n";
byte[] buf = Encoding.UTF8.GetBytes(t);
client.Send(buf);
long remaining = segmentSize;
buf = new byte[1024];
while (client.Connected)
{
int bytesToRead = remaining > buf.LongLength ? buf.Length : (int)remaining;
int bytesRead = stream.Read(buf, 0, bytesToRead);
if (bytesRead <= 0)
{
break;
}
remaining -= bytesRead;
client.Send(buf, 0, bytesRead, SocketFlags.None);
}
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
LogEvent(ex.Message.Split('\n')[0]);
}
}
заголовок Range
:
private static void ExtractRange(NameValueCollection headers, out long byteFrom, out long byteTo)
{
string t = headers.Get("Range");
if (!string.IsNullOrEmpty(t))
{
int n = t.IndexOf('=');
if (n >= 0)
{
t = t.Substring(n + 1);
}
if (!string.IsNullOrEmpty(t) && !string.IsNullOrWhiteSpace(t))
{
string[] splitted = t.Split('-');
byteFrom = long.Parse(splitted[0]);
byteTo = string.IsNullOrEmpty(splitted[1]) || string.IsNullOrWhiteSpace(splitted[1]) ?
-1L : long.Parse(splitted[1]);
return;
}
}
byteFrom = 0L;
byteTo = -1L;
}
Пробовал качать с него файлы - работает. Даже хэш сходится
А как сделать, чтобы браузер (или, например, VLC) играл медиафайлы? То есть, чтобы закинул ссылку и файл воспроизвёлся. Так может, например, Apache
. Как он это делает?
Сейчас если открыть ссылку на медиафайл, то он сначала весь передастся (сколько бы ни весил) и только тогда начинается воспроизведение. Но при этом, перемотка не работает
Да, content-type
я передаю.