我们正在尝试将代码从之前编写的ASP.NET迁移到ASP.NET Core 2.0。
这段代码将文档存储在SQL Server中并检索它。
***Original Code:***
protected void btnUpload_Click(object sender, EventArgs e)
{
foreach (HttpPostedFile postedFile in multipleUpload.PostedFiles)
{
string filename = Path.GetFileName(postedFile.FileName);
string contentType = postedFile.ContentType;
using (Stream fs = postedFile.InputStream)
{
using (BinaryReader br = new BinaryReader(fs))
{
byte[] bytes = br.ReadBytes((Int32)fs.Length);
string constr = ConfigurationManager.ConnectionStrings["ab"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
string query = "insert into ftr_UploadMultiple (name,contentType,data) values (@Name, @ContentType, @Data)";
using (SqlCommand cmd = new SqlCommand(query))
{
cmd.Connection = con;
cmd.Parameters.AddWithValue("@Name", filename);
cmd.Parameters.AddWithValue("@ContentType", contentType);
cmd.Parameters.AddWithValue("@Data", bytes);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
我们尝试使用以下代码,它只在DB中存储0个字节: 对此有任何建议应该是非常有帮助的。
ASP.NET Core 2.0中的代码
if (file.Length > 0)
{
using (var stream = new
FileStream(filePath, FileMode.Create))
{
await file.CopyToAsync(stream);
using (BinaryReader br = new BinaryReader(stream))
{
byte[] bytes = br.ReadBytes((Int32)stream.Length);
string constr = "<Connection String";
using (SqlConnection con = new SqlConnection(constr))
{
string query = "insert into ftr_UploadMultiple (data) values (@Data)";
using (SqlCommand cmd = new SqlCommand(query))
{
cmd.Connection = con;
cmd.Parameters.AddWithValue("@Data", bytes);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
我故意删除了结束}
。此外,在ASP.NET Core 2.0中无法使用下载已上载的文件Response.Binarywrite()
中的问题。
答案 0 :(得分:0)
在您调用CopyToAsync
将上传文件中的字节复制到文件流后,文件流的位置就在最后。然后,当您尝试从文件流中读取数据时,您只是在末尾读取空字节,从而导致读取0个字节。
最简单的解决方案是在阅读之前添加以下内容:
stream.Position = 0;
但是,除非您实际上需要将文件写入文件系统,否则这只是无关紧要的工作。最好将上传文件的流复制到MemoryStream
,然后只需使用ToArray
从中获取字节:不需要额外的阅读器。
答案 1 :(得分:0)
尝试从InputStream获取字节数组
// Read bytes from http input stream
BinaryReader b = new BinaryReader(file.InputStream);
byte[] binData = b.ReadBytes(file.ContentLength);
ASP.NET Core
if (file.Length > 0)
{
using (BinaryReader br = new BinaryReader(file.InputStream))
{
/* ... use file.Length or file.ContentLength */
byte[] bytes = br.ReadBytes(file.Length);
/* ... File Processing (bytes) */
}
}
。