WebApi上传文件
- WebApi
- 2020-07-14
- 16热度
- 0评论
后台代码:
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
namespace NewWeb.Api.Controllers
{
public class UpLoadFileController : ApiController
{
[HttpPost]
public async Task<IHttpActionResult> UpLoadFile()
{
try
{
//上传至文件路径
string directoryPath = "/wp-content/uploads/2024/05/FuJianCommon/";
//允许上传的文件扩展名
string fileTypes = ".jpg|.png";
if (!Request.Content.IsMimeMultipartContent())
{
return Ok("上传格式不是 multipart/form-data");
//throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root = HttpContext.Current.Server.MapPath("~" + directoryPath);
if (!Directory.Exists(root))
{
Directory.CreateDirectory(root);
}
var provider = new ReNameMultipartFormDataStreamProvider(root);
// 读取表单数据
await Request.Content.ReadAsMultipartAsync(provider);
StringBuilder sb = new StringBuilder();
foreach (var file in provider.FileData)
{
FileInfo fileinfo = new FileInfo(file.LocalFileName);
if (fileinfo.Length <= 0)
{
sb.Append("请上传文件");
}
else if (string.IsNullOrEmpty(fileinfo.Extension) || Array.IndexOf(fileTypes.Split('|'), fileinfo.Extension.ToLower()) == -1)
{
sb.Append("文件格式不正确");
}
//最大文件大小
else if (fileinfo.Length > 20000)
{
sb.Append("上传文件大小超过限制");
}
else
{
sb.Append(directoryPath + fileinfo.Name);
}
}
return Ok(sb.ToString());
}
catch (Exception ex)
{
return Ok("出现异常");
}
}
}
public class ReNameMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
{
public ReNameMultipartFormDataStreamProvider(string root) : base(root)
{
}
public override string GetLocalFileName(System.Net.Http.Headers.HttpContentHeaders headers)
{
//截取文件扩展名
string exp = Path.GetExtension(headers.ContentDisposition.FileName.TrimStart('"').TrimEnd('"'));
return DateTime.Now.ToString("yyyyMMddhhmmss") + new Random(DateTime.Now.Millisecond).Next(10000) + exp; ;
}
}
}
前台调用,html代码:
<form method="POST" action="http://localhost:8080/api/UpLoadFile/UpLoadFile" enctype="multipart/form-data">
<input type="file" name="fileupload"/>
<input type="submit" value="上传"/>
</form>
enctype="multipart/form-data"设置表单的MIME编码。默认是application/x-www-form-urlencoded,也就是name=value&name2=value2这种方式,但不能用于文件上传。
后台调用:
public string UploadFile(string Token)
{
NameValueCollection nvc = new NameValueCollection();
nvc.Add("Token", Token);
return HttpUploadFile(url + "/UFJXX", "E:\\图.jpg", nvc);
}
/// <summary>
/// 上传文件+参数
/// </summary>
/// <param name="url">上传地址</param>
/// <param name="file">文件地址</param>
/// <param name="nvc">其他参数</param>
/// <returns>上传返回成功失败文本</returns>
public string HttpUploadFile(string url, string file, NameValueCollection nvc)
{
string result = string.Empty;
string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
wr.ContentType = "multipart/form-data; boundary=" + boundary;
wr.Method = "POST";
//wr.KeepAlive = true;
wr.KeepAlive = false;
wr.Credentials = System.Net.CredentialCache.DefaultCredentials;
Stream rs = wr.GetRequestStream();
string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
foreach (string key in nvc.Keys)
{
rs.Write(boundarybytes, 0, boundarybytes.Length);
string formitem = string.Format(formdataTemplate, key, nvc[key]);
byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
rs.Write(formitembytes, 0, formitembytes.Length);
}
rs.Write(boundarybytes, 0, boundarybytes.Length);
string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
string header = string.Format(headerTemplate, "data", file, "application/x-www-form-urlencoded");
byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
rs.Write(headerbytes, 0, headerbytes.Length);
FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[4096];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
{
rs.Write(buffer, 0, bytesRead);
}
fileStream.Close();
byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
rs.Write(trailer, 0, trailer.Length);
rs.Close();
WebResponse wresp = null;
try
{
wresp = wr.GetResponse();
Stream stream2 = wresp.GetResponseStream();
StreamReader reader2 = new StreamReader(stream2);
result = reader2.ReadToEnd();
}
catch (Exception ex)
{
//if (wresp != null)
//{
// wresp.Close();
// wresp = null;
//}
}
finally
{
wr.Abort();
wr = null;
wresp.Close();
}
return result;
}
方法二:通过二进制流上传
注:
1、保存文件时可能会报错,XXX路径无法访问
在webconfig中<system.web>下加:<identity impersonate="true" userName="用户名" password="密码" />
2、修改上传文件大小限制,配置Web.config参照:Web.config 配置请求数据大小限制及超时

鲁ICP备19063141号
鲁公网安备 37010302000824号