我在这里遇到一些问题。
目前我正在使用Generic Handler将文件上传到服务器,但我遇到的一个问题是,如果我有额外的数据,比如用户的名字和姓氏,我必须这样做(保存)分开。
这是一个问题,因为如果我保存名称和姓氏,并且文件上传失败,我的数据库中有一条没有与之关联的文件的记录。
所以,现在我正在考虑实现一个新的Web方法,这将采取所有这些,如果该方法失败,它将只回滚SQL事务。
我想要做的是调用Web方法,并使用用户的姓名和照片传递该文件,然后在那里执行保存。
这就是我的尝试:
jQuery的:
$("#btnCreateRequest").click(function () {
var data = new FormData();
var photo = $("#fuPhoto")[0].files[0];
data.append("name", 'Fred');
data.append("surname", 'Moller');
data.append("photo", photo);
$.ajax({
type: "POST",
url: "Service.svc/CreateRequest",
dataType: "json",
//cache: false,
contentType: false,
processData: false,
data: data,
success: function (response2) {
//$("#PageArea").html(response2);
Popup(true, "success", "success", true);
},
error: function (response) {
Popup(true, "Error", JSON.stringify(response), true);
}
});
});
IService.cs
[OperationContract]
[WebInvoke(Method = "POST",
UriTemplate = "CreateRequest",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.WrappedRequest)]
string CreateRequest();
Service.svc
public string CreateRequest()
{
var request = System.Web.HttpContext.Current.Request;
string name = request["name"];
string surname = request["surname"];
HttpPostedFile photo = request["photo"];
//Saving in database happens here, using above variables...
return "whatever";
}
然而,我失败了。
调用Web服务,但所有变量都为NULL。
如果我以错误的方式解决这个问题,请指出我正确的方向 - 任何帮助将不胜感激!
(如果问题不明确,请询问,我会尝试解释更多)
答案 0 :(得分:0)
啊,不管怎样,我改变了方法。我现在使用Generic Handler而不是尝试使用Web服务。
有时,最好稍微看一下它。 以下是我为此工作的方法。
在我的jQuery中,我会有类似的东西:
$("#btnCreateRequest").click(function () {
var data = new FormData();
var photo = $("#fuPhoto")[0].files[0];
data.append("callingFromPage", "help");
data.append("requestType", $('#dropBugType').val());
data.append("description", $('#taDescription').val());
data.append("photo", photo);
data.append("userGUID", _cookieObject.UserObject.GlobalUniqueID);
$.ajax({
xhr: function () {
var xhr = new window.XMLHttpRequest();
xhr.upload.addEventListener("progress", function (evt) {
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
percentComplete = parseInt(percentComplete * 100);
//Indicate progress.
$('.uplPhotoProgress').css('width', percentComplete + '%');
$('.uplPhotoProgress').html('Uploading: ' + percentComplete + '%');
//Hide progress bar.
if (percentComplete === 100) {
$//('.uplProgressAttachments').css('display', percentComplete + 'none');
}
}
}, false);
return xhr;
},
url: "UploadHandler.ashx/",
data: data,
processData: false,
contentType: false,
type: "POST",
success: function (response) {
if (response === 'success') {
console.log('success');
} else {
console.log('problem...');
}
},
error: function (response) {
}
});
});
然后,在我的UploadHandler.ashx(Generic Handler)中:
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "multipart/form-data";
context.Response.Expires = -1;
try
{
string callingFromPage = context.Request["callingFromPage"];
if (!string.IsNullOrWhiteSpace(callingFromPage))
{
switch (callingFromPage)
{
case "help":
{
string requestType = context.Request["requestType"];
string description = context.Request["description"];
HttpPostedFile photo = context.Request.Files[0];
string guid = context.Request["userGUID"];
//DO YOUR STUFF >>>
context.Response.Write("success");
break;
}
}
}
catch (Exception ex)
{
context.Response.Write("Error: " + ex.Message);
}
}
当然,这是我所做的一个简单例子......但我很乐意这样做。