- 目录
- 文件上传
- 文件下载(请求方式是Get,并且只能用表单请求,否则返回的是流格式 不会自动下载)
- 下载需要的封装辅助函数
文件上传
[HttpPost]
public async Task<Result<List<FileUpLoadViewModel>>> UpLoad()
{
var result = new Result<List<FileUpLoadViewModel>>();
var tempList = new List<FileUpLoadViewModel>();
HttpFileCollection filelist = HttpContext.Current.Request.Files;
var id = HttpContext.Current.Request["Id"];
if (string.IsNullOrEmpty(id))
{
result.Status = (int)AjaxStatus.返回失败;
result.Message = "上传文件未设置类型";
return result;
}
var path = _service.GetFileRelation().Result.Data.Where(w => w.TypeId.ToString() == id).Select(s => s.FilePath).ToList()[0];
if (filelist != null && filelist.Count > 0)
{
for (int i = 0; i < filelist.Count; i++)
{
var temp = new FileUpLoadViewModel();
HttpPostedFile file = filelist[i];
string filename = file.FileName;
string savePath = HttpContext.Current.Server.MapPath(path);
if (!Directory.Exists(savePath))
{
Directory.CreateDirectory(savePath);
}
string filePath = Path.Combine(savePath, Guid.NewGuid() + "." + filename.Split('.')[1]);
file.SaveAs(filePath);
temp.OldPath = filename;
temp.NewPath = WebApiConfig.webStaticResource + filePath;
tempList.Add(temp);
}
result.Data = tempList;
result.Status = 200;
}
return result;
}
文件下载(请求方式是Get,并且只能用表单请求,否则返回的是流格式 不会自动下载)
注:(启用FIDDLER时不显式下载速度及进度)
[HttpGet]
public HttpResponseMessage GetFileResponse(string path, string FileName = null, string ContentType = "application/octet-stream")
{
var browser = String.Empty;
if (HttpContext.Current.Request.UserAgent != null)
{
browser = HttpContext.Current.Request.UserAgent.ToUpper();
}
string filePath = HttpContext.Current.Server.MapPath(path);//路径
FileName = null != FileName ? FileName : Path.GetFileName(filePath);
HttpResponseMessage response;
IWriteStreamToResponse<string> ResponseStreamWriter;
Action<Stream, HttpContent, TransportContext> sendMethod;
ResponseStreamWriter = new StreamFromFileName() { Suorce = filePath };
sendMethod = ResponseStreamWriter.WriteToStream;
response = Request.CreateResponse();
response.Content = new System.Net.Http.PushStreamContent(sendMethod);
response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(ContentType);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = browser.Contains("FIREFOX")? System.Web.HttpUtility.HtmlEncode(FileName):System.Web.HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8)
//火狐浏览器乱码问题
// FileName = System.Web.HttpUtility.HtmlEncode(newFileName)
};
return response;
}
下载需要的封装辅助函数
public interface IWriteStreamToResponse<T>
{
T Suorce { get; set; }
void WriteToStream(Stream outputStream, HttpContent content, TransportContext context);
}
public class StreamFromFileName : IWriteStreamToResponse<string>
{
private string _suorce;
public string Suorce
{
get
{
return _suorce;
}
set
{
_suorce = value;
}
}
public async void WriteToStream(Stream outputStream, HttpContent content, TransportContext context)
{
try
{
var buffer = new byte[1024 * 1024 * 2];
using (var video = File.Open(_suorce, FileMode.Open, FileAccess.Read, FileShare.Read))
{
var length = (int)video.Length;
var bytesRead = 1;
while (length > 0 && bytesRead > 0)
{
bytesRead = video.Read(buffer, 0, Math.Min(length, buffer.Length));
await outputStream.WriteAsync(buffer, 0, bytesRead);
length -= bytesRead;
}
}
}
catch (Exception ex)
{
return;
}
finally
{
outputStream.Close();
}
}
}
public class StreamFromBytes : IWriteStreamToResponse<Stream>
{
private Stream _source;
public Stream Suorce
{
get
{
return _source;
}
set
{
_source = value;
}
}
public async void WriteToStream(Stream outputStream, HttpContent content, TransportContext context)
{
try
{
var buffer = new byte[1024 * 1024 * 2];
using (var video = _source)
{
var length = (int)video.Length;
var bytesRead = 1;
while (length > 0 && bytesRead > 0)
{
bytesRead = video.Read(buffer, 0, Math.Min(length, buffer.Length));
await outputStream.WriteAsync(buffer, 0, bytesRead);
length -= bytesRead;
}
}
}
catch (Exception ex)
{
return;
}
finally
{
_source.Close();
outputStream.Close();
}
}
}
注:专转载请注明出处