c#语言怎么写上传文件,c# – 如何将文件上传到Web API服务器并发送参数?

对于迟到的答案我很抱歉,但是我们解决了这个问题(我忘了我没有在这里上传答案).基本上我们所做的就是在临时位置调用ReadAsMultiPartAsync方法,然后从请求中提取出其他参数.之后,我们验证了输入并将文件从临时移动到永久位置.

如果你想看到代码,这对我们的例子是有效的,我相信它很简单,以适应任何工作情况:

在客户端,我们有以下形式(是的,这个实现是为了演示目的,只支持发送一个文件…也是,输入type =“file”字段确实在窗体之外; fileId文本输入是在我们的案例中手动完成,仅用于测试目的)

其中getFileDetails()填充其他输入字段.此外,表单通过使用以下jQuery / Javascript发送到服务器:

$('#Upload').click(function(e) {

e.preventDefault();

var courseId = $('#courseId').val();

var fileId = $('#fileId').val();

if (!courseId || !fileId) {

return;

}

var headers = new Array();

headers["SessionId"] = sessionId;

headers["contentType"] = "application/json; charset=UTF-8";

var formData = new FormData();

var opmlFile = $('#fileInput').get(0).files;

// this is like the model we're expecting on the server

var files = [];

files.push({ 'Id': $('#fileId').val(), 'OriginalFileName': opmlFile[0].name, 'FileName': $('#FileName').val(), 'Extension': $('#Extension').val(), 'EntityId': $('#EntityId').val() });

formData.append("fileModels", JSON.stringify(files));

formData.append("File_0", opmlFile[0]);

$.ajax({

url: "api/Courses/" + courseId + "/Submissions/Add/",

headers: headers,

type: 'POST',

data: formData,

cache: false,

contentType: false,

processData: false,

dataType: 'json'

});

});

在服务器端,我们有以下几个:

// POST: api/Courses/{courseId}/Submissions/Add

[HttpPost]

[ValidateModelState]

[ValidateMimeMultipartContent]

[PermissionsAuthorize(CoursePermissions.CanCreateSubmissions)]

public async Task Add(int courseId)

{

// the same as in the jQuery part

const string paramName = "fileModels";

// Put the files in a temporary location

// this way we call ReadAsMultiPartAsync and we get access to the other data submitted

var tempPath = HttpContext.Current.Server.MapPath("~/App_Data/Temp/" + Guid.NewGuid());

Directory.CreateDirectory(tempPath);

var streamProvider = new MultipartFormDataStreamProvider(tempPath);

var readResult = await Request.Content.ReadAsMultipartAsync(streamProvider);

if (readResult.FormData[paramName] == null)

{

// We don't have the FileModels ... delete the TempFiles and return BadRequest

Directory.Delete(tempPath, true);

return Request.CreateResponse(HttpStatusCode.BadRequest);

}

// The files have been successfully saved in a TempLocation and the FileModels are not null

// Validate that everything else is fine with this command

var fileModels = JsonConvert.DeserializeObject>(readResult.FormData[paramName]).ToList();

// AT THIS POINT, ON THE SERVER, WE HAVE ALL THE FILE MODELS

// AND ALL THE FILES ARE SAVED IN A TEMPORARY LOCATION

// NEXT STEPS ARE VALIDATION OF THE INPUT AND THEN

// MOVING THE FILE FROM THE TEMP TO THE PERMANENT LOCATION

// YOU CAN ACCESS THE INFO ABOUT THE FILES LIKE THIS:

foreach (var tempFile in readResult.FileData)

{

var originalFileName = tempFile.Headers.ContentDisposition.FileName.Replace("\"", string.Empty);

var localTempPath = tempFile.LocalFileName;

}

}

我希望这将帮助任何人尝试通过使用Post请求一次提交文件和其他参数到服务器! 🙂

注意:服务器上使用的某些属性是自定义的. PermissionAuthorize,ValidateModelState和ValidateMimeMultiPartContent是我们使用的自定义过滤器.后两者的实施受到http://benfoster.io/blog/automatic-modelstate-validation-in-aspnet-mvc的启发

multipartcontent属性只是对actionContext.Request.Content.IsMimeMultipartContent()进行检查,如下所示:

public class ValidateMimeMultipartContent : ActionFilterAttribute

{

public override void OnActionExecuting(HttpActionContext actionContext)

{

if (!actionContext.Request.Content.IsMimeMultipartContent())

{

actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.UnsupportedMediaType, Messages.UnsupportedMediaType);

}

}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值