前言
web应用开发中,文件上传是一个常见且重要的功能。它不仅涉及到前端用户界面的设计,还涉及到后端服务器如何高效、安全地处理上传的数据。
本文将详细介绍一种基于asp.net web api的服务端解决方案以及两种不同的客户端实现方法,帮助开发者更好地理解和实现文件上传功能。
文件上传的核心实现
一、效果展示
通过以下截图可以直观地看到整个文件上传过程的效果:
postman测试

服务端接收

上传成功

二、服务端代码
服务端采用asp.net web api来处理文件上传请求,以下是核心代码片段:
using system;
using system.io;
using system.web;
using system.web.http;
namespace mes.controllers
{
public class filecontroller : apicontroller
{
[httppost]
public string uploadfile()
{
string result = string.empty;
try
{
// 核心部分 文件
string filename = httpcontext.current.request.files[0].filename;
stream stream = httpcontext.current.request.files[0].inputstream;
// 参数
var forms = httpcontext.current.request.form;
foreach (var item in forms)
{
string val = forms[item.tostring()];
}
// 保存路径
string uploadfolder = "f:\\图片";
string savepath = system.io.path.combine(uploadfolder, filename);
filestream fswrite = new filestream(savepath, filemode.create);
byte[] bytes = new byte[1024 * 4];
int total = 0;
int size = 0;
do
{
// 注意第二个参数是在buffer中的偏移量,不是在文件中的偏移量
size = stream.read(bytes, 0, bytes.length);
fswrite.write(bytes, 0, size);
total += size;
}
while (size > 0);
fswrite.close();
result = "true";
}
catch (exception ex)
{
result = ex.message;
}
return result;
}
}
}
三、客户端代码
客户端提供了两种方式来上传文件,分别是通过表单(multipart/form-data)的方式一和方式二。
方式一
public string postfile(string url, dictionary<string, object> dics, string filepath)
{
// 返回结果
string result = string.empty;
try
{
multipartformdatacontent form = new multipartformdatacontent();
using (httpclient client = new httpclient())
{
mediatypewithqualityheadervalue temp = new mediatypewithqualityheadervalue("application/json") { charset = "utf-8" };
client.defaultrequestheaders.accept.add(temp);//设定要响应的数据格式
// 参数
foreach (var keyvaluepair in dics)
{
form.add(new stringcontent(keyvaluepair.value.tostring()), keyvaluepair.key);
}
// 读取文件
stream filestream = new filestream(filepath, filemode.open, fileaccess.read);
var filename = path.getfilename(filepath);
// 设定文件类型表单项,使用streamcontent存放文件流
form.add(new streamcontent(filestream), "file", filename);
task<httpresponsemessage> task = client.postasync(url, form);
task.wait(); // 等待异步操作完成
httpresponsemessage response = task.result;
response.ensuresuccessstatuscode(); // 确保响应状态码表示成功
string responsebody = task.result.content.readasstringasync().result;
console.writeline(responsebody);
result = responsebody;
}
return result;
}
catch (exception ex)
{
throw new exception(ex.message);
}
}
方式二
public string postfile(string url, dictionary<string, object> dics, string filepath)
{
// 返回结果
string result = string.empty;
try
{
multipartformdatacontent form = new multipartformdatacontent();
using (httpclient client = new httpclient())
{
mediatypewithqualityheadervalue temp = new mediatypewithqualityheadervalue("application/json") { charset = "utf-8" };
client.defaultrequestheaders.accept.add(temp);//设定要响应的数据格式
// 参数
foreach (var keyvaluepair in dics)
{
form.add(new stringcontent(keyvaluepair.value.tostring()), keyvaluepair.key);
}
// 读取文件 读取为字节数据存入
using (var filestream = new filestream(filepath, filemode.open, fileaccess.read))
{
byte[] data = new byte[filestream.length];
filestream.read(data, 0, data.length);
filestream.close();
var filename = path.getfilename(filepath);
form.add(new bytearraycontent(data), "file", filename);
}
task<httpresponsemessage> task = client.postasync(url, form);
task.wait(); // 等待异步操作完成
httpresponsemessage response = task.result;
response.ensuresuccessstatuscode(); // 确保响应状态码表示成功
string responsebody = task.result.content.readasstringasync().result;
console.writeline(responsebody);
result = responsebody;
}
return result;
}
catch (exception ex)
{
throw new exception(ex.message);
}
}
总结
本文详细介绍了如何利用asp.net web api实现文件上传功能,并提供了两种不同风格的客户端实现方法。通过这种方式,不仅可以有效提高项目的可维护性和灵活性,还能确保文件上传的安全性与效率。
以上就是c#实现文件上传和接收功能的详细内容,更多关于c#文件上传和接收的资料请关注代码网其它相关文章!
发表评论