2016-07-25 13 views
0

bereitgestellt wurde. Ich habe ein sehr offensichtliches Problem, für das ich keine Lösung finden kann. Ich importiere Daten aus einer CSV-Datei in meine SQL-Datenbank - Dies funktioniert perfekt in meiner Entwicklungsumgebung, aber funktioniert nicht einmal auf unserem Dedicated-Server bereitgestellt (Dies ist vorübergehend für Testzwecke, die auf einen Webserver verschoben werden, ich habe nur ftp Zugriff auf, so kann nichts auf jedem installieren).Die CSV-Datei kann nicht importiert werden, sobald die MVC-Anwendung auf dem Server

Hier ist mein Code:

public ActionResult ImportExcel(PipelineDetails model, HttpPostedFileBase FileUpload, int ProjectID) 
    { 
     string Result = ""; 
     string UploadfileSaved_Path; 
     ProjectManager PM = new ProjectManager(); 
     PipelineData PD = new PipelineData(); 

     try 
     { 
      if (!FileUpload.FileName.EndsWith("csv")) 
      { 
       Result = "File type not allowed. Please import file using CSV format(Comma Delimited)."; 
       return RedirectToAction("Index", "Pipeline", new { id = ProjectID, result = Result }); 
      } 

      string[] lines = System.IO.File.ReadAllLines(FileUpload.FileName); 
      bool isHeader = true; 
      int i = 0; 

      foreach (string line in lines) 
      { 

       string[] col = line.Split(new char[] { ',' }); 

       if (i >= 1) 
       { 
        isHeader = false; 
       } 
       else 
       { 
        if (col[0] != "Accumulated_Length" || col[1] != "Elevation" || col[2] != "Pipe_Outside_Diameter" || 
            col[3] != "Wall_Thickness") 
        { 
         Result = "Import files Headers are incorrect. Please correct before retrying."; 
         return RedirectToAction("Index", "Pipeline", new { id = ProjectID, result = Result }); 
        } 
       } 

       if (col[0] == null || col[1] == null || col[2] == null || col[3] == null) 
       { 
        Result = "Some values are missing in the Import File. Please check the data."; 
        return RedirectToAction("Index", "Pipeline", new { id = ProjectID, result = Result }); 
       } 

       if (!isHeader) 
       { 
        if (i == 1) 
        { 

         PM.DeleteALLPipeLine_forProject(ProjectID); 
        } 

        using (RexusTradingEntities RTE = new RexusTradingEntities()) 
        { 
         PD.Accumulated_Length = Convert.ToDecimal(col[0]); 
         PD.Elevation = Convert.ToDecimal(col[1]); 
         PD.Pipe_Outside_Diameter = Convert.ToDecimal(col[2]); 
         PD.Wall_Thickness = Convert.ToDecimal(col[3]); 

         if (col[4] != "" && col[4] != null) 
         { 
          PD.Control_Point_Description = col[4]; 
         } 

         if (col[5] != "" && col[5] != null) 
         { 
          PD.Control_Point_Size = Convert.ToDecimal(col[5]); 
         } 

         PD.fkiProjectID = ProjectID; 
         PD.CreateDateTimeStamp = DateTime.Now; 

         RTE.PipelineDatas.Add(PD); 
         RTE.SaveChanges(); 
        } 
       } 

       i++; 
      } 
     } 
     catch (Exception ex) 
     { 
      //Result = "There is a problem with the Import File. Please check the file format or data."; 
      Result = ex.Message + " : " + FileUpload.FileName; 
      return RedirectToAction("Index", "Pipeline", new { id = ProjectID, result = Result }); 
     } 

     //Adding the Node Numbers in sequencial order 
     PM.UpdatePipelineNodeNumbers(ProjectID, model); 

     Result = "Import Success"; 

     return RedirectToAction("Index", "Pipeline", new { id = ProjectID, result = Result }); 
    } 

Und die Fehler, die ich bekommen habe ist: 'Could not find file 'C:\Windows\SysWOW64\inetsrv\RexusImportTemplate.csv'

nun so offensichtlich, wie diese (Datei nicht gefunden) erscheinen mag, verwende ich einen Dialog, in dem ich auswählen die Datei auf meinem PC (und andere werden auf ihren PCs), so dass ich nicht die Datei speichern muss (es sei denn, ich muss, wenn krank sogar Berechtigungen haben).

Ich versuchte mit FileUpload.SaveAs(FileUpload.FileName), aber dann habe ich einen Fehler, dass diese saveas nur im Stamm gespeichert werden kann. Dann versuchte ich FileUpload.SaveAs("~/" + FileUpload.FileName) und sagte, dass ich keinen Zugriff auf den Ordner habe ...

Ich dachte, dass die Datei aus dem angegebenen Pfad gelesen wird, anstatt einen Pfad auf dem Server, auf dem die Webanwendung bereitgestellt wurde ... ?

Ich habe mich schon eine Weile darum gekümmert - gibt es irgendwelche Arbeiten, die irgendjemand kennt?

Vielen Dank im Voraus!

Antwort

0

Wenn Sie laufen

System.IO.File.ReadAllLines(FileUpload.FileName) 

Sie sagen .net eine Datei aus dem Dateisystem mit dem gleichen Dateinamen zu lesen, wie die Datei hochgeladen, die Datei nicht der Benutzer hochgeladen.

Wenn Sie die Datei lokal speichern möchten, versuchen Sie den Pfad zu dem Ort, den Sie sie speichern möchten abzubilden, um (möglicherweise App_Data) vor SaveAs-Methode:

public ActionResult Index(HttpPostedFileBase file) { 

    if (file.ContentLength > 0) { 
    var fileName = Path.GetFileName(file.FileName); 
    var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName); 
    file.SaveAs(path); 
    //read your file's contents here 
    } 

    return RedirectToAction("Index"); 
} 

Entnommen http://haacked.com/archive/2010/07/16/uploading-files-with-aspnetmvc.aspx/

+0

Danke für die Antwort. Ich werde dies schnell überprüfen und lassen Sie mich wissen, was meine Ergebnisse sind. – AxleWack

+0

Gave it a Versuch und Zugriff verweigert: Zugriff auf den Pfad 'C: \ inetpub \ wwwroot \ SCF \ AirFlo \ App_Data \ Upload \ RexusImportTemplate.csv' wird verweigert – AxleWack

+0

Also habe ich es funktioniert, aber nur wenn ich Lese-/Schreibzugriff auf der App_Data-Ordner - Was ist großartig und alles, was es funktioniert, aber ich könnte mit dem gleichen Problem sitzen, wenn ich endlich FTP auf dem Client-Webserver ... verdammt. Danke in jedem Fall. Wird Ihre Antwort als Antwort markieren. – AxleWack

1

Ich denke, Sie müssen den Pfad auf dem Server zuordnen. Server.MapPath(PathWhereFilesWillBeSaved) um Dateien in Ihrem Projektverzeichnis auf einem Server speichern zu können. MSDN - Server.MapPath

1

Zwei Dinge:

  • Stellen Sie sicher, Sie überprüfen, ob die Datei FileUpload.HasFile() unter Verwendung existiert (MSDN Link)
  • Verwenden Server.MapPath(filename) (MSDN Link) Sie Abbildung auf die aktuellen Anwendungsverzeichnis, um sicherzustellen, beim Speichern/lesen.
+0

Dank für die Antwort. Die Datei existiert zwar lokal, aber nicht auf dem Server, auf dem sich die Anwendung befindet. Muss es importieren? Ich habe Folgendes versucht: FileUpload.SaveAs (Server.MapPath ("~ /") + FileUpload.FileName) und ich habe folgende Fehlermeldung erhalten: Zugriff auf den Pfad 'C: \ inetpub \ wwwroot \ SCF \ AirFlo \ RexusImportTemplate.csv' ist abgelehnt. – AxleWack

+1

@AxleWack: Sie müssen wahrscheinlich einen gültigen Pfad erstellen; 'Path.Combine (Server.MapPath (PathToFileDirectory), FileUpload.FileName);' Dies hat in der Vergangenheit für mich funktioniert, wenn ich Dateien von meinem Anwendungsverzeichnis auf einem Server abruft. – Ingenioushax

+0

@Ingenioushax Ich hatte einen gültigen Pfad, aber das Problem war Zugriffsrechte - Welches ist das Problem, wenn ich keinen Zugriff auf den Server selbst habe, um Lese-/Schreibzugriff auf den spezifischen älteren zu bieten :(Ich habe dies jetzt beantragt, also ich hoffe, sie werden ... Danke auf jeden Fall. – AxleWack