2

我需要将签名板集成到 Intranet (MVC4) 应用程序中,允许人们将电子签名应用于系统生成的文档。不幸的是,我得到的签名板只有一个 COM/ActiveX API,所以我编写了一个简短的 Windows 窗体应用程序,它允许用户捕获签名并将其上传到服务器。上传时,我需要 MVC4 操作将签名图像与 Windows 窗体请求发送的指定文档实体相关联。所以,假设我有这个模型:

public class DocumentToSign { 
    public int DocumentId { get; set; }
    public int DocumentTypeId { get; set; } 
}

然后我有这个动作来接收上传的图像:

[HttpPost]
public ActionResult UploadSignature(DocumentToSign doc, HttpPostedFileBase signature)
{
    //do stuff and catch errors to report back to winforms app
    return Json(new {Success = true, Error = string.Empty});
}

然后,上传图片的代码:

var doc = new DocumentToSign{ DocumentId = _theId, DocumentTypeId = _theType };
var fileName = SaveTheSignature();
var url = GetTheUrl();
using(var request = new WebClient())
{
    request.Headers.Add("enctype", "multipart/form-data");
    foreach(var prop in doc.GetType().GetProperties())
    {
        request.QueryString.Add(prop.Name, Convert.ToString(prop.GetValue(doc, null)));
    }
    var responseBytes = request.UploadFile(url, fileName);
    //deserialize resulting Json, etc.
}

DocumentToSign模型绑定器似乎可以毫无问题地拿起课程,但HttpPostedFileBase始终为空。我知道我需要以某种方式告诉模型绑定器上传的图像是signature动作中的参数,但我不知道该怎么做。我尝试使用UploadValueswith a NameValueCollection,但NameValueCollection只允许值为 a string,因此图像(即使作为 a byte[])不能成为其中的一部分。

是否可以从实际 MVC4 应用程序外部将文件和模型上传到相同的操作?我应该使用其他东西HttpPostedFileBase吗?除了WebClient? 我很茫然。

4

1 回答 1

1

var responseBytes = request.UploadFile(url, fileName);没有以控制器期望的格式发送文件。 HttpPostedFileBase适用于multipart/form-dataPOST 请求。但是 WebClient.UploadFile 不会发送多部分请求,它会将文件内容作为请求体发送,没有其他信息。您可以通过调用保存文件,Request.SaveAs(filename, false); 或者您必须更改发送文件的方式。但我不认为 WebClient 支持发送多部分请求。

于 2013-08-26T18:29:47.850 回答