2016-11-02 13 views
-1

フォームを送信しないときにボタンをクリックしてファイルをアップロードしようとしています。私は "物理的なパスですが、仮想的なパスが期待されていた"のようなエラーが発生しています。私はまだluck.actually私はDBにフロントエンドからajaxを使用してファイルのパスを保存したいserver.mapPathオプションを試してみました。ファイルパスを投稿mvcとajaxを使用してサブミットしないでください。ボタンをクリックしてボタンをクリックしてファイルをアップロードする必要があります。

$('#PEsubmit').click(function(){ 

     var Companyname = ''; 
     var flg = 0; 
     var Startdate = ''; 
     var enddate = ''; 
     var path = ''; 

     $('#PriorExperienceAdd tr').each(function() { 
      if (flg > 0) { 

       Companyname += $(this).find("td:eq(0)").find('input[type=text]').val(); 
       Companyname +='&' 

       Startdate += $(this).find("td:eq(1)").find('input[type=text]').val(); 
       Startdate += '~'; 

       enddate += $(this).find("td:eq(2)").find('input[type=text]').val(); 
       enddate += '#'; 

       path += $(this).find("td:eq(3)").find('input[type=file]').val(); 
       path += '%'; 
      } 
      flg++; 


     }); 
     if (Companyname.length > 1) { 
      Companyname = Companyname.substring(0, Companyname.length - 1); 
     } 
     if (Startdate.length > 1) { 
      Startdate = Startdate.substring(0, Startdate.length - 1); 
     } 
     if (enddate.length > 1) { 
      enddate = enddate.substring(0, enddate.length - 1); 
     } 
     if (path.length > 1) { 
      path = path.substring(0, path.length - 1); 
     } 

     var Pathdetails={ 
      "CompName": Companyname, 
      "StartDate": Startdate, 
      "EndDate": enddate, 
      "Path": path, 
     }; 

    $.ajax({ 
     url: '@Url.Action("AddPriorExperience", "ProfileDetails")', 
     data: JSON.stringify(Pathdetails), 
     type: 'POST', 
     contentType: 'application/json; charset=utf-8', 
     success: function (data) { 

     } 
    });//ajaxends 

     }); 




public void AddPriorExperience(string CompName, string StartDate, String EndDate, string Path, string filename) 
     { 

      CheckUser Sessiondetails = new CheckUser(); 
      int SessionRolevalue = Sessiondetails.CheckSessionuser(); 
      if (SessionRolevalue != 0) 
      { 
       using (EMSOffshoreEntities DB = new EMSOffshoreEntities()) 
       { 
        DB.Database.Connection.Open(); 
        AccountModel AccModel = new AccountModel(); 
        int loginId = Convert.ToInt32(Decrypt.AESDecryptstring(Convert.ToString(Session["LoginId"]))); 
        int selectedUserId = Convert.ToInt32(Decrypt.AESDecryptstring(Convert.ToString(Session["SelectedUser"]))); 
        List<Sp_GetPriorExperience_Result> PriExp = DB.Sp_GetPriorExperience(selectedUserId).ToList(); 
        List<Sp_GetSelectedUserDetail_Result> userdet = DB.Sp_GetSelectedUserDetail(selectedUserId).ToList(); 
        string Username = userdet.First().UserName; 
        AccModel.PriorExperience = PriExp; 
        CompName = CompName.Replace("undefined", ""); 
        StartDate = StartDate.Replace("undefined", ""); 
        EndDate = EndDate.Replace("undefined", ""); 
        Path = Path.Replace("undefined", ""); 
        Path = Path.Replace(" ", ""); 
        string filetype=""; 
        string[] pathspl = Path.Split('%'); 
        string subPath = "~/Documents/PriorExperience/" + selectedUserId + "-" + Username + "/" + filetype + "/"; 
        string filePath = System.Web.Configuration.WebConfigurationManager.AppSettings["BaseURL"] + "~/Documents/PriorExperience/" + selectedUserId + "-" + Username + "/" + filetype + "/"; 
        bool exists = System.IO.Directory.Exists(Server.MapPath(subPath)); 
        if (!exists) 
         System.IO.Directory.CreateDirectory(Server.MapPath(subPath)); 
        string rootFolderPath = Path; 
        rootFolderPath = rootFolderPath.Replace(System.Web.Configuration.WebConfigurationManager.AppSettings["BaseURL"], ""); 
        string flpth = rootFolderPath; 
        flpth = flpth.Replace(@"\PriorExperience", ""); 
        string subpath1 = Server.MapPath(subPath + filename); 
        subpath1 = subpath1.Replace(@"\PriorExperience", ""); 
        if (System.IO.File.Exists(flpth)) 
        { 
         System.IO.File.Move((flpth), (subpath1)); 
         filePath = filePath + Path; 
         //objdoc.SP_DeleteBasicDocs(userid, Convert.ToInt32(id), loginid, filePath); 
        } 

        DB.Database.Connection.Close(); 
       } 
      } 
      else 
      { 
       Redirect(ConfigurationManager.AppSettings["BaseUrl"] + "Account/Login"); 
      } 

     } 
+0

ajaxを使用してファイルをアップロードするには、FormDataを使用し、正しいajaxオプションを設定します([この回答](http://stackoverflow.com/questions/29293637/how-to-append-whole-set-of-モデルからフォームへのデータ取得およびmvc/29293681#29293681)) –

+0

FormDataにアクセスするためにフォームタグを使用していません。私はいくつかの他の解決策を得ることができますか? –

+1

あなたのコードを理解していないようです。ファイル入力は、 'HttpPostedFileBase'の型にポストバックします。' string'ではありません。あなたのやっていることは何の意味もありません。あなたはMVCサイトに行き、基本を学ぶ必要があります。特に、モデルにバインドしてそのモデルを投稿することができるようにするにはどうすればよいですか? –

答えて

2

は、ファイルのアップロードなどない同じものです。サーバーはクライアントからの要求を行うことができないため、クライアントのマシンから実際にファイルパスを使用して何かを実行する方法はありません。クライアントは実際にはサーバーにファイルを提供する必要があります。これがアップロードの仕組みです。

AJAXでファイルをアップロードするには、HTML 5の機能が必要です。これは、あなたのAJAXアップロードが最新のブラウザでのみ機能することを意味します。言い換えれば、IE 7-9のようなものをサポートする必要がある場合、この方法は完全に外になります。その場合のあなたの唯一の選択肢は、伝統的なフォーム投稿を行うか、何らかの種類のFlashまたはJavaコントロールを使用することです。 MVC側で

$('#MyForm').on('submit', function (e) { 
    e.preventDefault(); 
    var formData = new FormData(this); // `this` is the form instance 
    $.ajax({ 
     url: '/path/to/handler', 
     type: 'POST', 
     data: formData, 
     processData: false, 
     contentType: 'multipart/form-data', 
     success: function (data, textStatus, jqXHR) { 
      // do something on success 
     }, 
     error: function (jqXHR, textStatus, errorThrown) { 
      // do something on error 
     } 
    }); 
}); 

を、あなたはプロパティにファイル入力をバインドする必要があります:あなたは、あなたが次の線に沿ってコードが必要になります、現代のブラウザに完全に集中することができますと仮定

タイプHttpPostedFileBaseです。

+0

結論として、クライアントからファイルを取り出す方法はありません。 ajaxを使用してサーバー? –

+0

うーん..いいえ。それは私が全く言ったことではありません。私はあなたがそれをやろうとしている方法が*うまくいかないと言った。しかし、HTML 5では、AJAX経由でファイルをアップロードすることはできますが、HTML 5のみを使用することは可能です.EJ 7-9をサポートする必要がある場合、AJAX経由でファイルをアップロードする方法はありません。 HTML 5の機能 –

+0

はい私はそれを得た。 IEの下位バージョンではうまくいかないと言っています。だから、私はHttpPostedFileBaseを使うことを提案しています。フォームの提出なしにajaxを使用する他の方法はありますか? –

関連する問題