webapi批量上传照片(form-data)

 

#region 上传文件接口
/// <summary>
/// 上传文件
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
[Route("postFile")]
public Task<HttpResponseMessage> PostFile(HttpRequestMessage request)
{
// 是否请求包含multipart/form-data。
if (!request.Content.IsMimeMultipartContent())
{
Logger.Error("上传格式不是multipart/form-data");
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
if (!ModelState.IsValid)
{
Logger.Error("PostFile参数错误。");
throw new HttpResponseException(HttpStatusCode.BadRequest);
}

var root = AppDomain.CurrentDomain.BaseDirectory;
var provider = new MultipartFormDataStreamProvider(root);

// 阅读表格数据并返回一个异步任务.
var task = request.Content.ReadAsMultipartAsync(provider).ContinueWith<HttpResponseMessage>(t =>
{
HttpResponseMessage response = null;
if (t.IsFaulted || t.IsCanceled)
{
Logger.Info("PostFile is faulted or canceled: " + t.Exception.Message);
response = request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception);
}
else
{
//
string dicName = DateTime.Now.ToString("yyyyMMdd");
string ftpPath = CreateFolderAtFtp(modelName, dicName);

long visitInfoId = 0;
if (!long.TryParse(provider.FormData["visitInfoId"], out visitInfoId))
{
response = request.CreateErrorResponse(HttpStatusCode.InternalServerError, "参数格式错误!");
}
else
{
// 多文件上传
foreach (var file in provider.FileData)
{
string fileName = file.Headers.ContentDisposition.FileName;
if (fileName.StartsWith("\"") && fileName.EndsWith("\""))
{
fileName = fileName.Trim('"');
}
if (fileName.Contains(@"/") || fileName.Contains(@"\"))
{
fileName = Path.GetFileName(fileName);
}
String ext = System.IO.Path.GetExtension(fileName);
var newFileName = DateTime.Now.ToString("yyyyMMddhhmmssfff") + ext;
File.Copy(file.LocalFileName, Path.Combine(root, newFileName));
FileInfo img = new FileInfo(Path.Combine(root, newFileName));

FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpAddress + ftpPath + "/" + newFileName));
reqFTP.Credentials = new NetworkCredential(username, password);
reqFTP.KeepAlive = false;
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP.UseBinary = true;
reqFTP.ContentLength = img.Length;
int buffLength = 2048;
byte[] buff = new byte[buffLength];
int contentLen;
FileStream fs = img.OpenRead();
try
{
Stream strm = reqFTP.GetRequestStream();
contentLen = fs.Read(buff, 0, buffLength);
while (contentLen != 0)
{
strm.Write(buff, 0, contentLen);
contentLen = fs.Read(buff, 0, buffLength);
}
strm.Close();
fs.Close();
img.Delete();
File.Delete(file.LocalFileName);
}
catch (Exception ex)
{
Logger.Error("PostFile()服务器错误", ex);
response = request.CreateResponse(HttpStatusCode.InternalServerError, new { error = "文件上次失败,请与管理员联系!" });
}
var entity = new VisitPiction
{
CustomerVisitInfoId = visitInfoId,
Createtime = DateTime.Now,
Path = httpAddress + ftpPath + "/" + newFileName
};
customerService.AddVisitPic(entity);
}
response = request.CreateResponse(HttpStatusCode.OK, new { success = true });
}
}
return response;
});
return task;
}

public string CreateFolderAtFtp(string modelName, string dicName)
{
string ftpPath = string.Empty;
if (!string.IsNullOrEmpty(modelName))
{
//检测是否有该企业的模块文件夹
bool isExist = IsDirectoryExist(ftpAddress + modelName + "/");
if (!isExist)
{
string dic = CreateDirectoryAtFtp(modelName, "", "");
if (string.IsNullOrEmpty(dic))
{
throw new Exception("创建文件夹失败");
}
}
ftpPath += "/" + modelName;
}
if (!string.IsNullOrEmpty(dicName))
{

//检测是否有该企业模块下的子文件夹
bool isExist = IsDirectoryExist(ftpAddress + modelName + "/" + dicName + "/");
if (!isExist)
{
string dic = CreateDirectoryAtFtp(modelName, dicName, "");
if (string.IsNullOrEmpty(dic))
{
throw new Exception("创建文件夹失败");
}
}
ftpPath += "/" + dicName;
}
return ftpPath;
}
/// <summary>
/// 判斷指定得路徑是否存在于ftp上
/// </summary>
/// <param name="fileFullPath"></param>
public bool IsDirectoryExist(string fullDirectory)
{
if (!fullDirectory.EndsWith("/"))
fullDirectory += "/";
bool result = false;
//執行ftp命令 活動目錄下所有文件列表
Uri uriDir = new Uri(fullDirectory);
WebRequest listRequest = WebRequest.Create(uriDir);
listRequest.Method = WebRequestMethods.Ftp.ListDirectory;
listRequest.Credentials = new NetworkCredential(username, password);
//listRequest.KeepAlive = false; //執行一個命令后關閉連接
WebResponse listResponse = null;

try
{
listResponse = listRequest.GetResponse();
result = true;
}
catch
{
result = false;
}
finally
{
if (listResponse != null)
listResponse.Close();
}

return result;
}

/// <summary>
/// 在FTP創建一個新文件夾
/// </summary>
/// <param name="root">要在那个路径下创建文件夹</param>
/// <param name="DicLayer3"></param>
/// <returns>创建成功的ftp上的全路径</returns>
private string CreateDirectoryAtFtp(string DicLayer1, string DicLayer2, string DicLayer3)
{

try
{
//在ftp上的路径
string ftpPath = DicLayer1;
if (!string.IsNullOrEmpty(DicLayer2))
{
ftpPath += "/" + DicLayer2;
}
if (!string.IsNullOrEmpty(DicLayer3))
{
ftpPath += "/" + DicLayer3;
}
Uri uri = new Uri(ftpAddress + ftpPath);
FtpWebRequest listRequest = (FtpWebRequest)FtpWebRequest.Create(uri);
if (!IsDirectoryExist(uri.ToString()))
{
listRequest.Method = WebRequestMethods.Ftp.MakeDirectory;
}
else
{
CreateFullDirectoryAtFtp(uri.ToString());
listRequest.Method = WebRequestMethods.Ftp.ListDirectory;
}
listRequest.Credentials = new NetworkCredential(username, password);
listRequest.KeepAlive = false; //執行一個命令后關閉連接
FtpWebResponse listResponse = (FtpWebResponse)listRequest.GetResponse();

string fullPath = ftpAddress + ftpPath + "/";
Stream write = GetWriteStream(fullPath + "ftpPath.ini"); //在ftp上創建文件
byte[] context = System.Text.Encoding.Default.GetBytes("ftpPath=" + ftpPath);
write.Write(context, 0, context.Length);
write.Close();
return ftpPath; // 返回創建目錄路徑
}
catch (Exception ex)
{
Logger.Error("创建文件夹失败" + ex.Message);
return String.Empty;
}
}

/// <summary>
/// 在ftp上創建文件夾(若目錄不存在則依序創建)。
/// </summary>
/// <param name="directoryName"></param>
public void CreateFullDirectoryAtFtp(string directoryPath)
{
Uri uriDir = new Uri(directoryPath);
directoryPath = uriDir.AbsolutePath;
directoryPath = directoryPath.Replace(@"\", "/");
directoryPath = directoryPath.Replace("//", "/");
string[] aryDirctoryName = directoryPath.Split('/');
string realPath = "";
realPath = ftpAddress;
for (int i = 0; i < aryDirctoryName.Length; i++)
{
if (aryDirctoryName[i] != String.Empty)
{
realPath = realPath + "/" + aryDirctoryName[i];
if (!IsDirectoryExist(realPath))
{
CreateDirectoryAtFtp(realPath);
}

}
}
}
/// <summary>
/// 在ftp上創建文件夾,用於對zip文檔得解壓。
/// </summary>
/// <param name="directoryName"></param>
public void CreateDirectoryAtFtp(string directoryName)
{
try
{
Uri uri = new Uri(directoryName);
FtpWebRequest listRequest = (FtpWebRequest)WebRequest.Create(uri);
listRequest.Method = WebRequestMethods.Ftp.MakeDirectory;
listRequest.Credentials = new NetworkCredential(username, password);
listRequest.KeepAlive = false; //執行一個命令后關閉連接
FtpWebResponse listResponse = (FtpWebResponse)listRequest.GetResponse();
}
catch (Exception ex)
{
throw ex;
}
}

public Stream GetWriteStream(string fileFullName)
{
FtpWebRequest uploadRequest = (FtpWebRequest)WebRequest.Create(new Uri(fileFullName));
uploadRequest.Method = WebRequestMethods.Ftp.UploadFile;
uploadRequest.Credentials = new NetworkCredential(username, password);
uploadRequest.KeepAlive = false; //執行一個命令后關閉連接.
uploadRequest.UseBinary = true;
return uploadRequest.GetRequestStream();
}
/// <summary>
/// 获取文件路径
/// </summary>
/// <param name="strPath"></param>
/// <returns></returns>
private string MapPath(string strPath)
{
if (HttpContext.Current != null)
{
return HttpContext.Current.Server.MapPath(strPath);
}
else //非web程序引用 
{
strPath = strPath.Replace("/", "\\");
if (strPath.StartsWith("\\"))
{
strPath = strPath.TrimStart('\\');
}
return System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath);
}
}
#endregion

 

posted @ 2018-11-19 14:01  yaphetsfang  阅读(429)  评论(0编辑  收藏  举报