以WebApi的方式提供统一的文件上传下载服务,图片缩放和水印服务(基于.NetFramework4.5,写于2015年)
在mysql数据库上运行database.sql,以创建库表结构.
打开FileServer.sln解决方案,分别右击FileInApi项目和FileOutApi项目选择发布,将这两个网站分别发布到您磁盘的不同目录下.
分别修改两个网站的web.config中的数据库链接字符串,以及log4net配置部分的MariaDBAppender的数据库连接字符串(用于记录系统本身的日志).
在IIS(IIS7)以上新建两个网站(而不是添加应用程序),分别指向刚才的两个发布目录,应用程序池选择NetFramework4.0版本.
修改FileInApi的Set.config的Ex部分,设置文件上传的目录和上传文件大小限制,以及文件下载服务的网站地址:
<Ex>
<!--上传的文件的保存到这个根目录下-->
<FileUploadRootPath><![CDATA[D:\_File\]]></FileUploadRootPath>
<!--上传文件最大大小,M为单位-->
<FileMaxSize><![CDATA[100]]></FileMaxSize>
<!--文件下载服务的Api地址-->
<FileOutServerURL><![CDATA[http://localhost:7901]]></FileOutServerURL>
</Ex>
修改FileOutApi的Set.config的Ex部分,设置文件所存放的目录和缓存文件目录:
<Ex>
<File>
<!--和文件上传服务中所配置的文件根目录一样-->
<FileUploadRootPath><![CDATA[D:\_File\]]></FileUploadRootPath>
<!--文件缓存目录,用于存放自动生成的缓存文件-->
<ImageCacheRootPath>
<![CDATA[D:\_File\ImageCache\]]>
</ImageCacheRootPath>
</File>
</Ex>
都配置完以后,分别重启两个网站使配置生效.
接口名称 | 接口地址 | 参数说明 | 请求方式 | 返回值 | 备注 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
上传单个文件 | file\AddFile |
| POST/Form | { "State":1, "Data":{ "FileId":"36458056-6288-4c18-88e1-a42ff3416345", "AccessUrl":"[http://localhost:7901/file/GetFile?systemId=7ea62630-4994-11e7-9c7d-00ff659703f8&fileId=36458056-6288-4c18-88e1-a42ff3416345](http://localhost:7901/file/GetFile?systemId=7ea62630-4994-11e7-9c7d-00ff659703f8&fileId=36458056-6288-4c18-88e1-a42ff3416345)", "FileName":"libexpat-1.dll" } } |
State为1时代表成功,Data为对象, Data中的FileId表示该 文件的ID, Data中的AccessUrl表示该文件的访问地址. Data中的FileName表示文件名称. 请业务系将FileId或AccessUrl统保存到库中,将来访问该文件时会用到,推荐保存FileId.(将来服务地址变更时只要改访问前缀的配置,不用改数据库存放的内容) State为其它时,Data为具体失败的原因 | ||||||||||||
上传多个文件 | file\AddFiles |
| POST/Form | [ { "State":1, "Data":{ "FileId":"1b244b9d-7a4f-48fd-b3ad-fb9f33a7bb7f", "AccessUrl":"[http://localhost:7901/file/GetFile?systemId=7ea62630-4994-11e7-9c7d-00ff659703f8&fileId=1b244b9d-7a4f-48fd-b3ad-fb9f33a7bb7f](http://localhost:7901/file/GetFile?systemId=7ea62630-4994-11e7-9c7d-00ff659703f8&fileId=1b244b9d-7a4f-48fd-b3ad-fb9f33a7bb7f)", "FileName":"libpng14-14.dll" } }, { "State":1, "Data":{ "FileId":"9b164dcc-1ca6-41fe-8b45-f64cc731dcc0", "AccessUrl":"[http://localhost:7901/file/GetFile?systemId=7ea62630-4994-11e7-9c7d-00ff659703f8&fileId=9b164dcc-1ca6-41fe-8b45-f64cc731dcc0](http://localhost:7901/file/GetFile?systemId=7ea62630-4994-11e7-9c7d-00ff659703f8&fileId=9b164dcc-1ca6-41fe-8b45-f64cc731dcc0)", "FileName":"license.txt" } } ] |
返回值的解释请参照上传单个文件, 只是分别为每个文件返回了上传结果. | ||||||||||||
删除文件 | file\DeleteFile |
| POST/json | { "State":1, "Data":null } |
State为1时代表成功,Data为null, State为其它时,Data为具体失败的原因 |
文件下载服务:
接口名称 | 接口地址 | 参数说明 | 请求方式 | 返回值 | 备注 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
下载文件 | file\GetFile |
| get | 文件\图片 |
正常情况下是返回一个图片或文件, 当发生错误时,会返回json表示具体的错误原因 { "State":0, "Data":"文件信息不存在" } |
上传文件
上传前的准备:
1,请先在biz_system表里添加业务系统的信息,id字段就是业务系统的systemId,一般用guid.
2,重启两个网站(目的是刷新缓存中的业务系统信息))或用PostMan调用两个网站FileController中的RefreshSystemList方法,该方法参数的systemId是Set.config中配置的,不是数据库中的.
备注:为节省磁盘空间,同一文件重复上传只会保存一次文件(根据文件的MD5判定是否是相同文件),但会在数据库中分别存放上传的信息(文件的引用信息).
上传文件:
下边是Web方式上传的代码,供参考:
<html>
<head>
<meta charset="utf-8">
<script src="jquery.js"></script>
<script src="jquery.plugin.migrate1.2.1.js"></script>
</head>
<body>
<form id="uploadForm">
<input type="hidden" name="systemid" value="aeed0db2-4994-11e7-9c7d-00ff65970a5e" />
<input type="file" name="file" />
<input type="button" value="upload" onclick="doUpload();" />
</form>
</body>
<script type="text/javascript">
function doUpload() {
var formData = new FormData($("#uploadForm")[0]);
$.ajax({
url: 'http://localhost:7100/file/AddFile',
type: 'POST',
data: formData,
contentType: false,
processData: false,
success: function(returndata) {
alert(returndata);
},
error: function(returndata) {
alert(returndata);
}
});
}
</script>
</html>
下载文件
文件上传成功后,返回的数据中Data字段里有文件的下载路径,直接访问下载路径即可,对于非图片文件width,height,addWater,waterFontSize,waterText等图片处理的参数不起作用,直接返回原文件,对于图片类型的文件,会根据这些参数按原图比例加工成指定大小的图片.
下边附上PostMan的调用参数与返回值截图:
最后祝大家使用愉快,如果有帮助到您,记得点个星,再见不负遇见!