我已经去编辑代码了 - >这绝不是一件好事!
代码用于MVC中的文件上传器。问题是我一次上传两个文件,这意味着它们被插入到数据库中的单独行中。这是原始代码:
public ActionResult Index()
{
ViewData["Message"] = "Convert your eBooks!";
foreach (string upload in Request.Files)
{
if (!Request.Files[upload].HasFile1()) continue;
string mimeType = Request.Files[upload].ContentType;
Stream fileStream = Request.Files[upload].InputStream;
string fileName = Path.GetFileName(Request.Files[upload].FileName);
int fileLength = Request.Files[upload].ContentLength;
byte[] fileData = new byte[fileLength];
fileStream.Read(fileData, 0, fileLength);
const string connect = @"Server=localhost;Database=Images;user id=taraw; password=siemensbs;";
using (var conn = new SqlConnection(connect))
{
var qry = "INSERT INTO FileStore (FileContent, MimeType, FileName) VALUES (@FileContent, @MimeType, @FileName)";
var cmd = new SqlCommand(qry, conn);
cmd.Parameters.AddWithValue("@FileContent", fileData);
cmd.Parameters.AddWithValue("@MimeType", mimeType);
cmd.Parameters.AddWithValue("@FileName", fileName);
conn.Open();
cmd.ExecuteNonQuery();
}
}
return View();
}
这是我尝试修改代码以便单独接收文件而不是使用循环,并将它们插入数据库表中的单行:
public ActionResult Index()
{
if (!Request.Files["FileUpload1"].HasFile1())
{
string mimeTypePDF = Request.Files["FileUpload1"].ContentType;
Stream fileStreamPDF = Request.Files["FileUpload1"].InputStream;
string fileNamePDF = Path.GetFileName(Request.Files["FileUpload1"].FileName);
int fileLengthPDF = Request.Files["FileUpload1"].ContentLength;
byte[] fileDataPDF = new byte[fileLengthPDF];
fileStreamPDF.Read(fileDataPDF, 0, fileLengthPDF);
}
if(!Request.Files["FileUpload2"].HasFile1())
{
string mimeTypeCover = Request.Files["FileUpload2"].ContentType;
Stream fileStreamCover = Request.Files["FileUpload2"].InputStream;
string fileNameCover = Path.GetFileName(Request.Files["FileUpload2"].FileName);
int fileLengthCover = Request.Files["FileUpload2"].ContentLength;
byte[] fileDataCover = new byte[fileLengthCover];
fileStreamCover.Read(fileDataCover, 0, fileLengthCover);
}
const string connect = @"Server=localhost;Database=Images;user id=taraw; password=siemensbs;";
using (var conn = new SqlConnection(connect))
{
var qry = "INSERT INTO Book (FileContentPDF, MimeTypePDF, FileNamePDF, FileContentCover, MimeTypeCover, FileNameCover) VALUES (@FileContentPDF, @MimeTypePDF, @FileNamePDF, @FileContentCover, @MimeTypeCover, @FileNameCover)";
var cmd = new SqlCommand(qry, conn);
cmd.Parameters.AddWithValue("@FileContentPDF", fileDataPDF);
cmd.Parameters.AddWithValue("@MimeTypePDF", mimeTypePDF);
cmd.Parameters.AddWithValue("@FileNamePDF", fileNamePDF);
cmd.Parameters.AddWithValue("@FileContentCover", fileDataCover);
cmd.Parameters.AddWithValue("@MimeTypeCover", mimeTypeCover);
cmd.Parameters.AddWithValue("@FileNameCover", fileNameCover);
conn.Open();
cmd.ExecuteNonQuery();
}
return View();
}
现在我为每个cmd.Parameters.AddWithValue收到以下错误:
名称'fileDataPDF'不存在 在当前的背景下
我认为这是因为它不在IF语句之内,但我对如何构造它有点困惑。我最终想使用linq将文件插入到数据库中,因为上面的方法并不理想,但我现在的主要目的是让这一点工作。 任何帮助将非常感激:)
答案 0 :(得分:1)
您需要在if条件范围之外声明变量。 e.g。
string mimeTypePDF;
string fileNamePDF;
byte[] fileDataPDF;
if (!Request.Files["FileUpload1"].HasFile1())
{
mimeTypePDF = Request.Files["FileUpload1"].ContentType;
Stream fileStreamPDF = Request.Files["FileUpload1"].InputStream;
fileNamePDF = Path.GetFileName(Request.Files["FileUpload1"].FileName);
int fileLengthPDF = Request.Files["FileUpload1"].ContentLength;
fileDataPDF = new byte[fileLengthPDF];
fileStreamPDF.Read(fileDataPDF, 0, fileLengthPDF);
}
(Fwiw,我认为有更好的方法可以处理这个多文件上传,但上面是解决问题的最简单方法。)
答案 1 :(得分:0)
您需要在if语句之外声明fileDataPDF,否则它只对if块可见。
答案 2 :(得分:0)
如果之前byte[] fileDataPDF;
怎么样?
和fileDataPDF = new byte[fileLengthPDF];
里面的if?