c# - 使用 Asp.net MVC 5 在 Oracle Blob 中上传图像并在 html 页面上显示
问题描述
我在 asp.net 中有一个非常新的人寻求您的帮助,我正在尝试使用新用户的数据上传图像我可以成功地将用户信息添加到数据库中。但现在我坚持上传图片。我的表单完美地将所有数据传递给操作,所以我从那里开始:
public ActionResult SaveUser(string oid, string fname, string uname, string pass, string pass2, string bt, HttpPostedFileBase image)
{
string iuser = Session["UserID"].ToString();
string fileName = Path.GetFileName(image.FileName);
String fileExtension = Path.GetExtension(fileName);
int fileSize = image.ContentLength;
if (fileExtension.ToLower() == ".jpg" || fileExtension.ToLower() == ".jpeg")
{
Stream stream = image.InputStream;
BinaryReader binaryReader = new BinaryReader(stream);
byte[] bytes = binaryReader.ReadBytes((int)stream.Length);
}
if (pass == pass2)
{
if (bt == "0")
{
string packge = "tflhr.pro_new_user.insert_data";
ds = new DataSet();
ds = _clsDataAccess.package_user(packge, fname, uname, pass, iuser );
}
}
return RedirectToAction("User", new { cpid = 0, bt = 0 });
}
现在在包含图像的动作图像中,我如何将图像数据上传到数据库中,这是我的连接:
public DataSet package_user(string package, string fname, string pass, string uname, byte[] bytes, string iuser)
{
conn = new OracleConnection(clsConnection.ConnectionSave);
conn.Open();
cmd = new OracleCommand(package, conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("cur_c1", OracleType.Cursor).Direction = ParameterDirection.Output;
cmd.Parameters.Add("user_name", OracleType.VarChar).Value = fname;
cmd.Parameters.Add("user_pass", OracleType.VarChar).Value = pass;
cmd.Parameters.Add("user_enid", OracleType.VarChar).Value = uname;
cmd.Parameters.Add("user_name", OracleType.Blob).Value = bytes;
cmd.Parameters.Add("iuser", OracleType.VarChar).Value = iuser;
cmd.Parameters.Add("euser", OracleType.VarChar).Value = iuser;
oda = new OracleDataAdapter(cmd);
ds = new DataSet();
conn.Close();
oda.Fill(ds);
return ds;
}
和存储过程是:
CREATE OR REPLACE PACKAGE BODY TFLHR.pro_new_user as
procedure insert_data (cur_c1 out t_cursor, user_name in varchar2, user_pass in varchar2,
user_enid in varchar2, bytes in blob, iuser in varchar2, euser in varchar2)
is
code varchar2(5);
begin
select nvl(max(to_number(user_text)),0)+1 into code from tflhr.t_user;
insert into tflhr.t_user (oid, user_text, user_name, user_pass, user_enid,image, iuser, euser,user_path)
values
('USERx'||lpad(code,5,'0'), lpad(code,5,'0'), user_name, user_pass, user_enid, bytes, iuser, euser, lpad(code,5,'0'));
open cur_c1 for
select '1' from dual;
commit;
end insert_data;
end;
/
我得到了异常
异常图像 我如何更改此参数以上传图像。如果有任何错误,请帮助我并短路。谢谢你
解决方案
列表中命名参数的多个实例的异常发生是因为您添加了两次相同的参数名称,如此片段所示(并且参数名称也与参数数据类型相对应错误):
cmd.Parameters.Add("user_name", OracleType.VarChar).Value = fname;
cmd.Parameters.Add("user_pass", OracleType.VarChar).Value = pass;
cmd.Parameters.Add("user_enid", OracleType.VarChar).Value = uname;
// user_name parameter used twice here, the exception thrown
cmd.Parameters.Add("user_name", OracleType.Blob).Value = bytes;
您应该添加bytes
参数名称:
cmd.Parameters.Add("cur_c1", OracleType.Cursor).Direction = ParameterDirection.Output;
cmd.Parameters.Add("user_name", OracleType.VarChar).Value = fname;
cmd.Parameters.Add("user_pass", OracleType.VarChar).Value = pass;
cmd.Parameters.Add("user_enid", OracleType.VarChar).Value = uname;
cmd.Parameters.Add("bytes", OracleType.Blob).Value = bytes; // problem fixed
cmd.Parameters.Add("iuser", OracleType.VarChar).Value = iuser;
cmd.Parameters.Add("euser", OracleType.VarChar).Value = iuser;
请注意,您可以使用AddWithValue
来简化参数定义,但请确保它们以正确的数据类型传递。
此外,您应该以正确的顺序传递方法参数:
ds = _clsDataAccess.package_user(packge, fname, pass, uname, bytes, iuser);
因为方法签名看起来像这样:
public DataSet package_user(string package, string fname, string pass, string uname, byte[] bytes, string iuser)
推荐阅读
- python - 如何在不使用任何内置函数的情况下查找一个数字在列表中出现的次数
- java - 如何创建全屏 MaterialAlertDialog
- excel - 需要 BeforeClose 才能处理多个条件
- python - Dask 数组广播似乎与稀疏矩阵不兼容
- sbt - 用于创建 fat jar 的单个 sbt 文件
- reporting-services - 在 SSRS 报表生成器中添加一个参数,其中包含字符串/varchar 值,但 SQL 中的字段是数字
- mysql - Postgres 删除相关数据表的过程
- reactjs - 如何在反应中从嵌套数组中获取计数
- javascript - 令人困惑的 webpack 语法。尝试从 2017 年的旧教程中修复 webpack.config 文件
- mysql - Ansible 无法访问数据库 Mysql