file mvc文件上传

这次做了一个文件导入功能,要做的工作只有3步。

第一步:将文件上传至服务器

第二步:读取服务器的文件

第三步:将读取的文件,放入一个DataTable中,然后返回给前台页面。

 

(1)html代码如下:

<form id="fileForm" action="../DispatchList/UpFile" method="post" enctype="multipart/form-data" >
<div id="fileDiv">
    <input type="file" name="fileUpload" id="fileUpload" style="display:none" /> <!--上传-->
</div>
</form>

    首先将html文件放入一个form,然后在页面插入一个上传控件,file。注意:一定要添加 enctype="multipart/form-data" 这个标签。因为添加了这个才可以上传,文件是以二进制流的方式传输,上传二进制数据。

(2)后台代码如下:

    前台form中给了一个action="../DispatchList/UpFile" ,当我保存的时候,$('#fileForm').submit();时,自动跳到UpFile方法中。以下是vb.net代码。

''' <summary>
    ''' 上传文件
    ''' </summary> 
    <HttpPost()>
    Public Function UpFile(ByVal fileUpload As Web.HttpPostedFileWrapper) As ActionResult
        Try
            Dim ext As String = IO.Path.GetExtension(fileUpload.FileName)
            Dim ImportDataFilePath = Server.MapPath("../ImportDataFiles/")
            Dim newFileName As String = ImportDataFilePath & Date.Now.ToString("yyyyMMddhhmmss") & ext

            If IO.File.Exists(newFileName) Then
                Return Content("服务器已存在相同名称的文件,请更改重命名文件!")
            Else
                fileUpload.SaveAs(newFileName)
            End If
Dim dt As DataTable = ExcelToDataTable(newFileName) Dim file As New FileInfo(newFileName) If file.Exists Then '删除单个文件 file.Delete() End If Return Content(CommonTools.ObjectToJson(JSSerializerObject.SerializerDataTable(dt))) Catch ex As Exception Return Content("错误信息:" & Environment.NewLine & If(ex.InnerException Is Nothing, ex.Message, ex.InnerException.Message)) End Try End Function   '将数据返回一个DataTable Public Shared Function ExcelToDataTable(strExcelFileName As String) As DataTable Dim ConnStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strExcelFileName & ";" & "Extended Properties='Excel 8.0;HDR=NO;IMEX=1';" Dim Conn As New OleDbConnection(ConnStr) Conn.Open() Dim SQL As String = "select * from [sheet1$]" Dim da As New OleDbDataAdapter(SQL, ConnStr) Dim ds As New DataSet() da.Fill(ds) Dim dt As DataTable dt = ds.Tables(0) Conn.Close() Return dt End Function

 

(3)在做的过程中出现的问题

在做的过程中出现了一个问题,file控件的change事件,只触发一次。

$("#fileUpload").change(function () {

var ss = $('#fileUpload').val()
if (ss != "") {
  $('#fileForm').submit();
  showLoading("正在导入数据,请稍等...")
} 
});

最终解决是,将file控件的值清空就可以了。如下所示:

function FileSuccess(data) { 
            if (data.startsWith("错误信息")) { alert(data); }
            else {
                hideLoading();

                var rowData = StringToJson(data);

                for (var i = 1; i < rowData.length; i++) {
                    $("#ttbody").datagrid("appendRow", {
                        DLID: $("#tt").datagrid("getSelected").DLID,
                        iQuantity: rowData[i].F5,
                        cInvCode: rowData[i].F1,
                        cInvName: rowData[i].F2,
                        cInvStd: rowData[i].F3,
                        cMeasureUnit: rowData[i].F4,
                        cLicPlateNum: rowData[i].F6,
                        cRemark: rowData[i].F7
                    });
                }
                ComputeSum();

                $('#fileUpload').val("")
            }
        }

如果没有清空file控件的值,chang事件是不会触发的。

 

 ---------有哪里不对的地方,请各位批评指正。谢谢!---------

 

posted @ 2013-08-09 10:47  淡 淡  阅读(167)  评论(0)    收藏  举报