首先:引用JQuery,這個是必不可少的;
JavaScript:
<script type="text/javascript">
function doUpload() {
var formData = new FormData($("#uploadForm")[0]);
$.ajax({
url: 'http://localhost:34181/HomeService.asmx/UploadFile?jsoncallback=?',
type: 'POST',
data: formData,
async: false,
cache: false,
contentType: false,
processData: false,
// dataType: "jsonp",//問題就在這里,如果用了jsonp,那么后台就接收不到文件流,無法獲得文件流,就沒辦法把文件寫入服務器。如果不指定,就是注釋掉,雖然ajax提交之后,還是跑到error那里去,但是文件已經是成功寫入服務器的了。
jsonp: "jsoncallback",
success: function(returndata) {
var vData = JSON.stringify(returndata);
alert(vData);
},
error: function(returndata) {
var vData = JSON.stringify(returndata);
alert(vData);
}
});
}
</script>
HTML:
<
form id="uploadForm"
>
<p>指定文件名:
<input type="text" name="filename" value="" />
</p>
<p>上傳文件:
<input type="file" name="file" />
</ p>
<input type="button" value="上傳" onclick="doUpload()" />
</form>
后台(WebService):
///
<summary>
/// 上傳文件
/// </summary>
/// <returns></returns>
[WebMethod(EnableSession = true)]
public void UploadFile()
{
HttpContext.Current.Response.ContentType = "application/json;charset=utf-8";
string jsonCallBackFunName = HttpContext.Current.Request.Params["jsoncallback"].ToString();
//這里如果前台沒有用jsonp,那么獲取到的是一個?,所以處理完之后,前台是沒法獲取到服務器返回的內容的。
//上面代碼必須,不能注釋
//中間代碼執行自己的業務操作,可返回自己的任意信息(多數據類型)
string strJson = "";
HttpFileCollection files = HttpContext.Current.Request.Files;
string strFileName = HttpContext.Current.Request["filename"];
byte[] b = new byte[files[0].ContentLength];
System.IO.Stream fs = (System.IO.Stream)files[0].InputStream;
fs.Read(b, 0, files[0].ContentLength);
///定義並實例化一個內存流,以存放提交上來的字節數組。
MemoryStream m = new MemoryStream(b);
///定義實際文件對象,保存上載的文件。
FileStream f = new FileStream(Server.MapPath("\\UploadFile") + "\\"
+ files[0].FileName, FileMode.Create);
///把內內存里的數據寫入物理文件
m.WriteTo(f);
m.Close();
f.Close();
f = null;
m = null;
if (strJson == "")
{
strJson = "0";
}
//下面代碼必須,不能注釋
HttpContext.Current.Response.Write(string.Format("{0}({1})", jsonCallBackFunName, strJson));
HttpContext.Current.Response.End();
}
前面的Formdata提交,是我在別處看到的一個人分享的,也特別感謝他,雖然我目前還有bug,但至少已經實現了我上傳文件的目的,否則,還得把項目通過fileupload控件來實現,這樣訪問速度肯定慢了,我把上述心得發出來,希望大家共同進步,如果已經解決這個問題的,請賜教,謝謝。
貼出上述方法的原文鏈接:http://yunzhu.iteye.com/blog/2177923