使用Angularjs中的Web API将pdf文件作为varbinary(max)插入数据库?

Posted

技术标签:

【中文标题】使用Angularjs中的Web API将pdf文件作为varbinary(max)插入数据库?【英文标题】:Insert pdf file as varbinary(max) into the database using web API in Angularjs? 【发布时间】:2020-03-26 16:43:40 【问题描述】:

我尝试将 pdf 文件插入数据库,但它被插入为 0 代表 int 数据类型和 null 代表 varbinary(max) 到数据库中。我还使用邮递员进行了测试,将数据传递到 Web API 控制器,但它仍然作为 0 和 null 插入到数据库中。

[HttpPost]
        [ActionName("addReceiptDocument")]
        public int insertReceiptDocument(receiptDocument rd)
        
            rd = new receiptDocument();            
            SqlConnection myConnection = new SqlConnection();
            myConnection.ConnectionString = ConfigurationManager.ConnectionStrings["ERPConnectionString"].ConnectionString;
            SqlCommand sqlCmd = new SqlCommand();
            //DateTime now = DateTime.Now;
            sqlCmd.CommandType = CommandType.StoredProcedure;
            sqlCmd.CommandText = "INSERT_RECEIPT_DOCUMENT";
            sqlCmd.Connection = myConnection;
            sqlCmd.Parameters.AddWithValue("@RDID", rd.RDID);
            sqlCmd.Parameters.AddWithValue("@RECEIPTID", rd.RECEIPTID);
            //var request = HttpContext.Current.Request;
            //var filePath = "Z:\\Templates\\Images\\" + request.Headers["filename"];
            //using (var fs = new System.IO.FileStream(filePath, System.IO.FileMode.Create))
            //
            //    request.InputStream.CopyTo(fs);
            //
            sqlCmd.Parameters.AddWithValue("@DOCUMENT", rd.DOCUMENT);
            myConnection.Open();
            int rowInserted = sqlCmd.ExecuteNonQuery();
            myConnection.Close();
            return 1;
        
$scope.submit = function (files) 
    //var fd = new FormData();
    //Take the first selected file
    //fd.append("payloadFile", 33);
    //fd.append("payloadFile", 98746);
    //fd.append("payloadFile", files);

    $http.post('http://localhost:49556/api/purchaseOrder/addReceiptDocument',
               fd,  headers:  'Content-Type': undefined  
    ).then(function (response) 
        alert('success');
    )

<form name="oForm" id="oForm">
    File: <input type="file" id="payloadFile" name="payloadFile" /><br />
    <input type="submit" value="Submit"  ng-click="submit(files)" />
</form>  
public class receiptDocument
    
        public int RDID  set; get; 
        public int RECEIPTID  set; get; 
        public byte[] DOCUMENT  set; get; 
    

【问题讨论】:

这能回答你的问题吗? How to insert PictureBox to Sql Server Database Varbinary(MAX) with C#? 稍微匹配,但我想插入一个pdf文件 就像您的其他问题一样,您正在将一个空白文档插入到您的数据库中,因为您正在设置 rd = new reciptDocument.因此,清除作为参数传递给函数的任何数据。 【参考方案1】:

代替

sqlCmd.Parameters.Add("@DOCUMENT", rd.DOCUMENT);

你可以写

sqlCmd.Parameters.Add("@DOCUMENT", SqlDbType.VarBinary, rd.DOCUMENT.Length).Value = rd.DOCUMENT;

还要交叉检查rd.DOCUMENT中的值是否正确

【讨论】:

出现错误,如下所示:错误 3 方法“AddWithValue”没有重载需要 3 个参数 \api\Controllers\purchaseOrderController.cs 已更新,我猜您使用的是最新版本的 .net,此处提供文档:docs.microsoft.com/en-us/dotnet/api/… 获取空引用异常

以上是关于使用Angularjs中的Web API将pdf文件作为varbinary(max)插入数据库?的主要内容,如果未能解决你的问题,请参考以下文章

我如何将web api中的标题内容返回给AngularJS $ http服务

如何从 AngularJS 站点安全地连接到 web api

chrome 中的 Angularjs 应用程序中的 CORS 错误访问 .NET Web Api

使用 Web API 和 AngularJS 保存表单数据(选择列表)

angularjs中的初始数据加载

AngularJS + ASP.NET Web API + ASP.NET MVC 身份验证