遇到的问题(基于Web服务前后端分离开发):
(1)服务端通过文件流的形式把图片上传至服务器指定的文件夹下,但是部署以后却不能实现图片上传。
解决的方法:
(2)主要原因没有理解Web项目的本质:
浏览器相当于客户端,当客户端向服务器端提交上传文件时(注意:基于前后端分离开发,客户端调用远程服务上传图片和文件),被上传的文件路径虽然提交到了服务器端,但是服务器端的磁盘上通过被上传的文件路径是检测不到该图片的存在的,因此在进行File.Exists(filePath)是检测不到的。最终通过Form表单提交值服务器端,实现图片上传值服务器指定文件夹下。(小白再次记录学习的过程...)
以下是代码的实现过程:
Html页面表单布局:<form id="UpPicture" enctype="multipart/form-data" action="服务器路径地址" method="post">
<table>
<tr>
<td>工号</td>
<td>
<input type="type" name="Emp_Id" />
<input type="type" name="Cer_Id" />
<input type="file" name="Picture"/>
</td>
</tr>
<tr>
<td>提交</td>
<td>
<input type="submit" value="提交" /></td>
</tr>
</table>
</form>
服务器端是实现:
/// <summary>
/// 新头像上传方法,客户端通过表单的形式上传
/// </summary>
/// <param name="emp_id">员工id</param>
/// <param name="cer_id">证书记录id</param>
/// <returns></returns>
[HttpPost, Route("upload/picture")]
public IHttpActionResult NewPictureUpload()
{
//首先获客户端表单传递过来的Form数据
string _empId = HttpContext.Current.Request.Form["Emp_Id"];
string _cerId = HttpContext.Current.Request.Form["Cer_Id"];
//接收表单传递过来的图片,需要限定上传的图片格式:".JPG", ".JPEG", ".GIF", ".PNG", ".BMP"
var file = HttpContext.Current.Request.Files["Picture"];
//首先判断表单中的员工id和证书记录是否为空,为空则限制客户从客户端上传图片,因为即使上传成功也对应不到记录
if (!string.IsNullOrWhiteSpace(_empId) && !string.IsNullOrWhiteSpace(_cerId))
{
//检查文件是否被预览选中,判断方式:通过判断文件名是否为空或者空字符串
if (!string.IsNullOrWhiteSpace(file.FileName))
{
//限定上传图片的格式类型
string[] LimitPictureType = { ".JPG", ".JPEG", ".GIF", ".PNG", ".BMP" };
//当图片上被选中时,拿到文件的扩展名
string currentPictureExtension = Path.GetExtension(file.FileName).ToUpper();
//此处对图片上传的类型进行限定操作
if (LimitPictureType.Contains(currentPictureExtension))
{
//此处标记图片上传至服务器的唯一新名称
string _newFileName = Guid.NewGuid().ToString();
string _toServerPicturePath = DateTime.Now.Year + "/" + DateTime.Now.Month + "/";
string _dbPicturePath = "Certifications/" + _toServerPicturePath + _newFileName + currentPictureExtension;
_toServerPicturePath = AppDomain.CurrentDomain.BaseDirectory + "Certifications/" + _toServerPicturePath;//最终生成的文件名:+_newFileName +currentPictureExtension
//首先判断图片上传至服务的路径是否存在,不存在则创建并执行保存操作,存在则直接保存
if (Directory.Exists(_toServerPicturePath))
{
//最终上传的文件路径全名
_toServerPicturePath = _toServerPicturePath + _newFileName + currentPictureExtension;
}
else
{//不存在此路径,则创建后执行保存操作
Directory.CreateDirectory(_toServerPicturePath);
_toServerPicturePath = _toServerPicturePath + _newFileName + currentPictureExtension;
}
//执行保存图片,并插入数据库操作
file.SaveAs(HttpContext.Current.Server.MapPath("~/" + _dbPicturePath));
执行数据库相关操作,没有异常则代码继续执行,否则跳出
bflag = true;
msg = "图片上传操作成功!";
}
else
{
msg = "图片上传操作失败,请选择扩展名为:.JPG, .JPEG, .GIF, .PNG, .BMP 等类型图片。";
}
}
else
{
msg = "图片上传操作失败,图片没有被选中!";
}
}
else
{
msg = "图片上传操作失败,请检查记录是否被选中!";
}
return MyJson(new { flag = bflag, msg = msg });
}