FileUpload1.PostedFile.FileName вызывает исключение - PullRequest
1 голос
/ 17 июля 2009

Я использую ASP.NET для чтения данных в файле Excel. Я использую элемент управления загрузкой файлов, чтобы прочитать файл. Я могу прочитать данные из файла на моем локальном компьютере, но после развертывания кода на сервере, когда я пытаюсь прочитать файл с клиентского компьютера, я получаю исключение.

FileUpload1.PostedFile.FileName выдает исключение на сервере.

Сообщение об исключении:

'D:\path in client machine\MyExcel.xls' could not be found. Check the spelling of the file name, and verify that the file location is correct. If you are trying to open the file from your list of most recently used files on the File menu, make sure that the file has not been renamed, moved, or deleted.

Пожалуйста, помогите.

Код:

<add key="OleDbConnection" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=
          FilePath ;Extended Properties=&quot;Excel 8.0;HDR=Yes;IMEX=1&quot;"/>

string OleDbConnection = 
    ConfigurationManager.AppSettings["OleDbConnection"].ToString().Replace("FilePath", 
        fileUpload.PostedFile.FileName).Trim();

Excel.ApplicationClass xlApp = new Excel.ApplicationClass();
Excel.Workbooks xlWorkBooks = (Excel.Workbooks)xlApp.Workbooks;

Excel.Workbook wb = xlWorkBooks._Open(fileUpload.PostedFile.FileName, Type.Missing,
    false, Type.Missing, "", "", true, Excel.XlPlatform.xlWindows, "\t", true,
    false, Type.Missing, true);

    string strSheetName = ((Excel.Worksheet)wb.Sheets[1]).Name.ToString();
    xlWorkBooks.Close();
    xlApp.Quit();

   oledbCommand = new OleDbCommand();
   oledbAdapter = new OleDbDataAdapter();
   DataSet dsExcellData = new DataSet();


   oledbConnection = new OleDbConnection(OleDbConnection); 
   oledbConnection.Open();
   oledbCommand.Connection = oledbConnection;

   oledbCommand.CommandText = "Select * from [" + strSheetName + "$]"; 
   oledbAdapter.SelectCommand = oledbCommand;
   oledbAdapter.Fill(dsExcellData);
   return dsExcellData

Привет, я публикую пример кода, который у меня есть

Добавьте элемент управления загрузкой файлов и кнопку. Нажмите кнопку, чтобы выполнить приведенный ниже код после выбора файла на клиентском компьютере.

string OleDbConnection = "Provider = Microsoft.Jet.OLEDB.4.0; Источник данных = \" FilePath \ "; Расширенные свойства = \" Excel 8.0; HDR = Да; IMEX = 1 \ ""; OleDbConnection = OleDbConnection.Replace ("FilePath", FileUpload1.PostedFile.FileName); Label6.Text = OleDbConnection;

        string strSheetName = "ASSET_RECV";
        OleDbConnection oledbConnection;
        OleDbCommand oledbCommand;
        OleDbDataAdapter oledbAdapter;

        oledbCommand = new OleDbCommand();
        oledbAdapter = new OleDbDataAdapter();
        DataSet dsExcellData = new DataSet();

        oledbConnection = new OleDbConnection(OleDbConnection);
        oledbConnection.Open();
        oledbCommand.Connection = oledbConnection;
        //oledbCommand.CommandText = "Select * from [{0}$]";

        oledbCommand.CommandText = "Select * from [" + strSheetName + "$]"; // i want to find this sheet name
        oledbAdapter.SelectCommand = oledbCommand;
        oledbAdapter.Fill(dsExcellData);

        oledbConnection.Close();
        GridView1.DataSource = dsExcellData.Tables[0];
        GridView1.DataBind();

1) Опубликуйте проект в IIS. Попробуйте запустить приложение с другого компьютера и прочитать данные из файла excel (с клиентского компьютера).

Вы получите ошибку ниже. Помогите.

Механизму базы данных Microsoft Jet не удалось найти объект 'D: \ FileName.xls'. Убедитесь, что объект существует, и что вы правильно написали его имя и путь.

Ответы [ 4 ]

1 голос
/ 17 июля 2009

Я думаю, вам нужно сохранить файл, прежде чем вы сможете его открыть. Вы можете использовать:

PostedFile.SaveAs()

чтобы сохранить его на сервере.

Это помогло?

1 голос
/ 17 июля 2009

Можете ли вы опубликовать свой код загрузки?
Должно быть что-то вроде этого ..

<asp:FileUpload ID="batchUpload" runat="server" />
<asp:Button runat="server" ID="uploadButton" Text="Upload" OnClick="UploadButton_Click" />

protected void UploadButton_Click(object sender, EventArgs e)
  {
    // Server time out 50 mins..
    Context.Server.ScriptTimeout = 60 * 50;

    errorLabel.Style[HtmlTextWriterStyle.Color] = "Red";
    if (batchUpload.PostedFile == null || batchUpload.PostedFile.ContentLength == 0) {
      errorLabel.InnerText = "Enter a valid file";
      uploadButton.Enabled = true;
      return;
    }
    string path = XMAppSettings.UploadsPath;
    filePath = Path.Combine(path, batchUpload.FileName);
    try {
      batchUpload.SaveAs(filePath);
    } catch (HttpException exception) {
      errorLabel.InnerText = "Fatal error";
      exception.Log();
      return;
    }

Обратите внимание на batchUpload.SaveAs(filePath)
Подтвердите сохранение!

Кроме того, поскольку вы пытаетесь извлечь данные из таблицы Excel, я предлагаю вам использовать Linq над наборами данных (если вы не планируете делать вставки).Excel.ApplicationClass потребует, чтобы вы ссылались на операции Excel

/// <summary>
  /// Summary description for ExcelHelper.
  /// </summary>
  internal sealed class ExcelHelper
  {
    private const string CONNECTION_STRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<FILENAME>;Extended Properties=\"Excel 8.0;HDR=Yes;\";";

    public static DataTable GetDataTableFromExcelFile(string fullFileName, ref string sheetName)
    {
      OleDbConnection objConnection = new OleDbConnection(CONNECTION_STRING.Replace("<FILENAME>", fullFileName));
      DataSet dsImport = new DataSet();
      try {
        objConnection.Open();
        DataTable dtSchema = objConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
        if ((null == dtSchema) || (dtSchema.Rows.Count <= 0)) {
          throw new ArgumentNullException("No sheets");
        }
        //Reading the first sheet name from the Excel file.
        sheetName = dtSchema.Rows[0]["TABLE_NAME"].ToString();
        new OleDbDataAdapter("SELECT * FROM [" + sheetName + "]", objConnection).Fill(dsImport);
      } catch (Exception e) {
        e.Log();
        throw;
      } finally {
        objConnection.Close();
        objConnection.Dispose();
      }
      return dsImport.Tables[0];
    }
  }

, а затем выполняли такие вещи, как

  var table = ExcelHelper.GetDataTableFromExcelFile(fileName, ref something).AsEnumerable();
  var rollnoList = table
    .Where(x => !String.IsNullOrEmpty(x.Field<string>("Roll Number")))
    .Select(x => ExtractUser(x));
0 голосов
/ 25 июля 2009

Спасибо за ответы. Я исправил проблему.

Ошибка, которую я сделал, я предоставил FileUpload1.PostedFile.FileName как путь к строке подключения Excel. Что происходит, когда мы развертываем код на сервере и пытаемся прочитать исключение, - это поиск файла в пути к серверу.

Таким образом, нам нужно сохранить файл на сервере перед чтением файла, и нам нужно передать этот путь к серверу в строку подключения к Excel.

После прочтения данных из Excel вы можете удалить файл.

Но я не уверен, есть ли какая-то другая работа, например, передача файлового объекта в качестве источника данных для строки подключения к Excel.

0 голосов
/ 17 июля 2009

Вы должны убедиться, что файл существует там, где вы говорите. Ошибка говорит, что не может найти файл, указанный путем. Также убедитесь в правильности написания.

...