使用Javascript和c# Web将文件转换为二进制



我想上传文件到SQL Server数据库,并再次从web浏览器下载(任何文件:xlsx, pdf等)。

这是我的HTML标记:

<input type="file" class="form-control-file" id="fileupload1" onchange="showname()" />

Javascript转换成二进制文件:

var filename;
var contentType;
var filestream;
var fixarray;
const fileByteArray = [];
function showname() {
var name = document.getElementById('fileupload1');
filename = name.files.item(0).name;
contentType = name.files.item(0).type;
var reader = new FileReader();
reader.readAsArrayBuffer(name.files[0]);
reader.onload = function () {
filestream = reader.result;
fixarray = new Uint8Array(filestream);
for (let i = 0; i < fixarray.length; i++) {
fileByteArray.push(fixarray[i]);
}
};
}

My AJAX Call (events.)从其他函数成功调用Id):

$.ajax({
type: "POST",
dataType: "json",
contentType: "application/json; charset=utf-8",
url: "confirmationcomplete.aspx/finish",
data: '{ id: ' + JSON.stringify(events.id) + ',contentType: "' + contentType + '",name: "' + filename + '",binaryy: "' + fileByteArray + '"}',
success: function (data) {
alert('Success upload');
},
error: function (xhr, status, error) {
alert(xhr.responseText);
}
})
后台代码(c#):
[WebMethod]

public static void finish(int id, string contentType, string name, string binaryy)
{
string str = @"Data Source=172.16.111.45SQLEXPRESS;Initial Catalog=dashboard;User ID=sa;Password=sdfgh";
SqlConnection cn2 = new SqlConnection(str);
SqlCommand cmd7 = new SqlCommand("[sp_uploadfile]", cn2);
cmd7.Parameters.Add("@eventID", SqlDbType.Int);
cmd7.Parameters["@eventID"].Value = id;
cmd7.Parameters.Add("@contentType", SqlDbType.VarChar);
cmd7.Parameters["@contentType"].Value = contentType;
cmd7.Parameters.Add("@name", SqlDbType.VarChar);
cmd7.Parameters["@name"].Value = name;
byte[] byteArray = Encoding.UTF8.GetBytes(binaryy);
cmd7.Parameters.Add("@byte", SqlDbType.VarBinary,-1);
cmd7.Parameters["@byte"].Value = byteArray;
cmd7.CommandType = CommandType.StoredProcedure;
try
{
cn2.Open();
cmd7.ExecuteNonQuery();
cn2.Close();
}
catch (Exception ex)
{
}
}

存储过程:

CREATE PROCEDURE [dbo].[sp_uploadfile]  
@eventID int,
@contentType varchar(255),
@name varchar(255),
@byte varbinary(MAX)
AS
BEGIN
INSERT INTO eventsScheduler 
VALUES (@eventID, @contentType, @name, @byte)
END

从上面所有的代码来看,上传文件到SQL Server数据库是成功的。

但是当我试图从浏览器下载它时,它抛出一个错误

Excel无法打开文件…因为文件格式或扩展名无效

按钮下载:

<asp:LinkButton runat="server" ID="btndownload" OnClick="DownloadFile" CommandArgument="<%#hdID%>">Download Report</asp:LinkButton>
这是我的下载代码:
protected void DownloadFile(object sender, EventArgs e)
{
int a = Convert.ToInt32(hdID.Value);
byte[] bytes;
string contentType, fileName;
string constr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandText = "select  EventID,contentType,filename, report from [eventsScheduler] where EventID=@id";
cmd.Parameters.AddWithValue("@id", a);
cmd.Connection = con;
con.Open();
using (SqlDataReader sdr = cmd.ExecuteReader())
{
sdr.Read();
bytes = (byte[])sdr["report"];
contentType = sdr["contentType"].ToString();
fileName = sdr["filename"].ToString();
}
con.Close();
}
}
if (bytes.Length != 0)
{
Response.Clear();
Response.Buffer = true;
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = contentType;
Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
Response.BinaryWrite(bytes);
Response.Flush();
Response.End();
}
else
{
}
}

我认为问题是在javascript代码中转换文件上传的二进制文件。

所以我试图创建一个新的上传控件(使用asp控件),并尝试直接上传文件:

ASP Control:

<asp:FileUpload ID="fileUpload_NewProblem" runat="server" Width="100%" />

按钮上传:

<asp:LinkButton runat="server" OnClick="Unnamed_Click">Upload</asp:LinkButton>

按钮动作:

protected void Unnamed_Click(object sender, EventArgs e)
{
uploadFile();
}
后端代码:
public void uploadFile()
{
id = Convert.ToInt32(Request["id"]);
int ids = id; // int.Parse((sender as LinkButton).CommandArgument);
string filename = Path.GetFileName(fileUpload_NewProblem.PostedFile.FileName);
string contentType = fileUpload_NewProblem.PostedFile.ContentType;
using (Stream fs = fileUpload_NewProblem.PostedFile.InputStream)
{
using (BinaryReader br = new BinaryReader(fs))
{
byte[] bytes = br.ReadBytes((Int32)fs.Length);
string constr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
string query = " INSERT INTO eventsScheduler VALUES (@eventID,@contentType,@name,@byte )";
using (SqlCommand cmd = new SqlCommand(query))
{
cmd.Connection = con;
cmd.Parameters.AddWithValue("@eventID", ids);
cmd.Parameters.AddWithValue("@name", filename);
cmd.Parameters.AddWithValue("@contentType", contentType);
cmd.Parameters.AddWithValue("@byte", bytes);
try
{
con.Open();
cmd.ExecuteNonQuery();
con.Close();

}
catch (Exception ex)
{
}
}
}
}
}
}

当我使用第二种方法(没有AJAX)上传文件时,我使用相同的下载代码成功下载了文件。

我的问题是:如何将文件转换为二进制使用javascript以相同的方式与c# ?

我解决了。

我意识到Javascript将我的文件转换为string ("10,30,5,3")

在服务器端,我将这些string转换为Intarray

int[] array = binaryy.Split(',').Select(int.Parse).ToArray();

最后我将intarray转换为bytearray

byte[] bytes = array.Select(i => (byte)i).ToArray();

最新更新