c# - After download/upload files from MS SQL, the files become unreadable -
i have asp mvc app, ms sql , c#. download file ms sql, upload file db. after file become unreadable. can't understand happens. below code, returns file client.
public string createfile(httppostedfilebase file) { string stream_id = string.empty; seek { 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 files(name, file_stream) output inserted.stream_id @mytablevar values(@name, @file_stream);" + "select top (1) @identity = stream_id @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(); } } grab { } homecoming 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 files stream_id = @stream_id"; var cmd = new sqlcommand(qry, conn); cmd.parameters.addwithvalue("@stream_id", stream_id); conn.open(); seek { rdr = cmd.executereader(); if (rdr.hasrows) { rdr.read(); filecontent = (byte[])rdr["file_stream"]; mimetype = rdr["file_type"].tostring(); filename = rdr["name"].tostring(); } success = true; } grab { homecoming null; } } if (success == true) { filecontentresult newfile = new filecontentresult(filecontent, contenttype); newfile.filedownloadname = filename; homecoming newfile; } homecoming null; }
from looking @ code stores posted file database - forgot re-create actual file content, initialized empty byte array length of posted file, , saved db.
.net has class can help save stream sql server without allocating buffer , reading entire stream first - sqlbytes. seek replace line:
byte[] bytes = new byte[file.contentlength];
with this:
sqlbinary bytes = new sqlbinary(file.inputstream);
you can take @ sqlbinary usage in this post.
c# sql
No comments:
Post a Comment