+ Tạo class: InMemoryMultipartFormDataStreamProvider
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Web;
// Nếu thiếu System.Net.Http thì vào C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5
// copy vào thư mục bin của project
namespace WebAPIUpload.App_Code
{
public class InMemoryMultipartFormDataStreamProvider : MultipartStreamProvider
{
private NameValueCollection _formData = new NameValueCollection();
private List<HttpContent> _fileContents = new List<HttpContent>();
// Set of indexes of which HttpContents we designate as form data
private Collection<bool> _isFormData = new Collection<bool>();
/// <summary>
/// Gets a <see cref="NameValueCollection"/> of form data passed as part of the multipart form data.
/// </summary>
public NameValueCollection FormData
{
get { return _formData; }
}
/// <summary>
/// Gets list of <see cref="HttpContent"/>s which contain uploaded files as in-memory representation.
/// </summary>
public List<HttpContent> Files
{
get { return _fileContents; }
}
public override Stream GetStream(HttpContent parent, HttpContentHeaders headers)
{
// For form data, Content-Disposition header is a requirement
ContentDispositionHeaderValue contentDisposition = headers.ContentDisposition;
if (contentDisposition != null)
{
// We will post process this as form data
_isFormData.Add(String.IsNullOrEmpty(contentDisposition.FileName));
return new MemoryStream();
}
// If no Content-Disposition header was present.
throw new InvalidOperationException(string.Format("Did not find required '{0}' header field in MIME multipart body part..", "Content-Disposition"));
}
/// <summary>
/// Read the non-file contents as form data.
/// </summary>
/// <returns></returns>
public override async Task ExecutePostProcessingAsync()
{
// Find instances of non-file HttpContents and read them asynchronously
// to get the string content and then add that as form data
for (int index = 0; index < Contents.Count; index++)
{
if (_isFormData[index])
{
HttpContent formContent = Contents[index];
// Extract name from Content-Disposition header. We know from earlier that the header is present.
ContentDispositionHeaderValue contentDisposition = formContent.Headers.ContentDisposition;
string formFieldName = UnquoteToken(contentDisposition.Name) ?? String.Empty;
// Read the contents as string data and add to form data
string formFieldValue = await formContent.ReadAsStringAsync();
FormData.Add(formFieldName, formFieldValue);
}
else
{
_fileContents.Add(Contents[index]);
}
}
}
/// <summary>
/// Remove bounding quotes on a token if present
/// </summary>
/// <param name="token">Token to unquote.</param>
/// <returns>Unquoted token.</returns>
private static string UnquoteToken(string token)
{
if (String.IsNullOrWhiteSpace(token))
{
return token;
}
if (token.StartsWith("\"", StringComparison.Ordinal) && token.EndsWith("\"", StringComparison.Ordinal) && token.Length > 1)
{
return token.Substring(1, token.Length - 2);
}
return token;
}
}
}
+ API Upload:
/// <summary>
/// Upload Document.....
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("MediaUpload")]
public async Task<HttpResponseMessage> MediaUpload()
{
// Check if the request contains multipart/form-data.
//if (!Request.Content.IsMimeMultipartContent())
//{
// throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
//}
var x = Request.Content.Headers.ContentLength; // kích thước Body: = 0 body rỗng
var provider = await Request.Content.ReadAsMultipartAsync<InMemoryMultipartFormDataStreamProvider>(new InMemoryMultipartFormDataStreamProvider());
//access form data
NameValueCollection formData = provider.FormData;
//Get body headers info: json key
string json = "";
if (formData["json"] != null)
{
json = formData["json"];
}
//access files
IList<HttpContent> files = provider.Files;
int dem = 0;
foreach (HttpContent fileContent in files)
{
// body key
string key = fileContent.Headers.ContentDisposition.Name.Trim('\"');
string thisFileName = fileContent.Headers.ContentDisposition.FileName.Trim('\"');
// stream
Stream input = await fileContent.ReadAsStreamAsync();
//folder path
DateTime dt = DateTime.Now;
string sPath = Static.GetPath() + "/PhanAnh/" + DateTime.Now.ToString("yyyy/MM") + "/";
sPath = HttpContext.Current.Server.MapPath(sPath);
//create folder if not Exists
if (!Directory.Exists(sPath))
Directory.CreateDirectory(sPath);
//file path
string fileName = DateTime.Now.ToString("yyyyMMddHHmmssfff");
var fileExtension = Path.GetExtension(thisFileName);
var filePath = System.IO.Path.Combine(sPath, fileName + fileExtension);
using (Stream file = File.OpenWrite(filePath))
{
input.CopyTo(file);
file.Close();
}
dem++;
}
var response = Request.CreateResponse(HttpStatusCode.OK);
//response.Headers.Add("DocsUrl", URL);
//response.Content = new StringContent("Upload thành công file: " + thisFileName + ". Lưuvào thư mục ClientDocument", Encoding.UTF8);
if (dem > 0)
response.Content = new StringContent("Upload thành công " + dem + " file - Chuoi json = " + json);
return response;
}
Không có nhận xét nào:
Đăng nhận xét