【发布时间】:2014-06-24 10:57:54
【问题描述】:
我有 ASP MVC 应用程序、MS SQL 和 C#。我将文件下载到 MS SQL,然后从 DB 上传文件。在此之后,文件变得不可读。我不明白会发生什么。下面的代码,将文件返回给客户端。
public string CreateFile(HttpPostedFileBase file)
{
string stream_id = String.Empty;
try
{
int size = file.ContentLength;
string name = file.FileName;
string contentType = file.ContentType;
byte[] bytes = new byte[size];
file.InputStream.Read(bytes, 0, size);
string constr = ConfigurationManager.ConnectionStrings["PokrovConnectionString"].ConnectionString;
using (TransactionScope ts = new TransactionScope())
{
using (SqlConnection con = new SqlConnection(constr))
{
string query = "DECLARE @MyTableVar TABLE (stream_id uniqueidentifier);"
+ "INSERT INTO Files(name, file_stream) OUTPUT INSERTED.stream_id INTO @MyTableVar VALUES(@name, @file_stream);"
+ "SELECT TOP (1) @Identity = stream_id FROM @MyTableVar;";
using (SqlCommand cmd = new SqlCommand(query))
{
cmd.Connection = con;
cmd.Parameters.Add("@name", SqlDbType.VarChar).Value = Path.GetFileName(file.FileName);
cmd.Parameters.Add("@file_stream", SqlDbType.VarBinary).Value = bytes;
SqlParameter idParam = cmd.Parameters.Add("@Identity", SqlDbType.NVarChar, 1000);
idParam.Direction = ParameterDirection.Output;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
stream_id = (string)idParam.Value;
}
}
ts.Complete();
}
}
catch { }
return stream_id;
}
public FileContentResult GetFile(Guid stream_id, string contentType = "application/octet-stream")
{
SqlDataReader rdr;
byte[] fileContent = null;
string mimeType = "";
string fileName = "";
string connect = onfigurationManager.ConnectionStrings["PokrovConnectionString"].ConnectionString;
bool success = false;
using (var conn = new SqlConnection(connect))
{
var qry = "SELECT file_stream, name, file_type FROM Files WHERE stream_id = @stream_id";
var cmd = new SqlCommand(qry, conn);
cmd.Parameters.AddWithValue("@stream_id", stream_id);
conn.Open();
try
{
rdr = cmd.ExecuteReader();
if (rdr.HasRows)
{
rdr.Read();
fileContent = (byte[])rdr["file_stream"];
mimeType = rdr["file_type"].ToString();
fileName = rdr["name"].ToString();
}
success = true;
}
catch
{
return null;
}
}
if (success == true)
{
FileContentResult newFile = new FileContentResult(fileContent, contentType);
newFile.FileDownloadName = fileName;
return newFile;
}
return null;
}
【问题讨论】:
-
不可读是什么意思?
-
我希望我能理解他认为他对文件做了什么。
-
不可读的文件是数据库文件吗?
-
例如,如果是图像,我无法使用 Paint 打开它,或者如果它是 MS World 文件,当我打开它时不会读取字符。
-
您是否为 FileContentResult 填充 FileContents 属性?您能在保存/加载文件二进制数据的位置显示代码片段吗?