如何在ASP.NET核心2.0中处理上传的文件

时间:2018-03-08 16:06:14

标签: c# asp.net asp.net-core asp.net-core-2.0

我们正在尝试将代码从之前编写的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()中的问题。

2 个答案:

答案 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) */           
    }
}