Передать имя файла из элемента управления загрузкой файлов в файловый поток - PullRequest
0 голосов
/ 19 августа 2010
    SqlConnection conn = new SqlConnection("Data Source=DDPRO8-WIN7X86\\SQLEXPRESS;Initial Catalog=mp3bytes;Persist Security Info=True;Integrated security=true; User ID=; Password=;");
    SqlCommand cmd = null;
    SqlParameter param = null;
    cmd = new SqlCommand(" INSERT INTO mp3_bytes (songs) " + " Values (@songs) ", conn);
    FileStream fs = null;

    string path = fileUpload.FileName;
    fs = new FileStream(path, FileMode.Open, FileAccess.Read);

    Byte[] song = new Byte[fs.Length];
    fs.Read(song, 0, song.Length);
    fs.Close();
    param = new SqlParameter("@songs", SqlDbType.VarBinary, song.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, song);
    cmd.Parameters.Add(param);
    conn.Open();
    cmd.ExecuteNonQuery();
    conn.Close();

где fileUpload - элемент управления загрузкой файлов. Я загружаю mp3 файл. Когда я выполняю это, я получаю, что не могу найти файл '', как я могу передать загруженное имя файла в filestream из элемента управления загрузки файла?

Ответы [ 2 ]

2 голосов
/ 19 августа 2010

Использовать fileUpload.PostedFile.FileName

Также лучше проверить, был ли загружен какой-либо файл, используя свойство fileUpload.HasFile.Вы также можете защититься от файлов нулевой длины, проверив fileUpload.PostedFile.ContentLength > 0.

Редактировать: только что осознал свою ошибку

Содержимое загруженного файла необходимо сохранить надиск, используя метод fileUpload.PostedFile.SaveAs.Приведенное выше свойство имени файла даст вам имя файла на клиентском компьютере, но файл не будет существовать на сервере.Вам нужно сохранить его где угодно на сервере.Например,

var path = Path.Combine(tempDirectory, fileUpload.PostedFile.FileNam);
fileUpload.PostedFile.SaveAs(path);

Это поместит загруженный файл во временный каталог на сервере.Вы также можете использовать PostedFile.InputStream для чтения содержимого файла.

fs = new FileStream(path, FileMode.Open, FileAccess.Read); никогда не будет работать, так как файл не существует на компьютере веб-сервера.

Редактировать: на основе вашего примера кода

Удалите FileStream fs = null; и замените

fs = new FileStream(path, FileMode.Open, FileAccess.Read);

на

var fs = uploadFile.PostedFile.InputStream;

, и это должно сработать.

0 голосов
/ 19 августа 2010

Если вам действительно нужно использовать FileStream, вам нужно установить FileMode на «Создать», а не «Открыть», так как вы не открываете файл, вы создаете его.

fs = new FileStream(path, FileMode.Create);

РЕДАКТИРОВАТЬ: Но, как говорит VinayC, SaveAs () делает всю тяжелую работу за вас!

EDIT: похоже, вы пытаетесь сохранить файл на диск, а затем прочитать байты из файла для передачидо кв.Вы можете обойти эту часть сохранения / чтения, просто получив FileBytes из FileUpload элемента управления.

SqlConnection conn = new SqlConnection("Data Source=DDPRO8-WIN7X86\\SQLEXPRESS;Initial Catalog=mp3bytes;Persist Security Info=True;Integrated security=true; User ID=; Password=;");
SqlCommand cmd = null;
SqlParameter param = null;
cmd = new SqlCommand(" INSERT INTO mp3_bytes (songs) " + " Values (@songs) ", conn);

param = new SqlParameter("@songs", SqlDbType.VarBinary, fileUpload.FileBytes.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, fileUpload.FileBytes);
cmd.Parameters.Add(param);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
...