Javascript 成功将文件上传到MySQL中的字节数组,但下载时内容不可读
在使用JavaScript XMLHttpRequest中的FormData上传文件并连接到Web API并将其作为LONGBLOB数据类型保存到MySQL DB后,我在下载内容时遇到问题。当我试图下载之前作为BLOB上传到MySQL DB的文件时,该文件正在下载,但是该文件不再可读。有什么解决办法吗 以下是我用于将文件作为字节数组上载到DB的代码:Javascript 成功将文件上传到MySQL中的字节数组,但下载时内容不可读,javascript,c#,mysql,asp.net-web-api,Javascript,C#,Mysql,Asp.net Web Api,在使用JavaScript XMLHttpRequest中的FormData上传文件并连接到Web API并将其作为LONGBLOB数据类型保存到MySQL DB后,我在下载内容时遇到问题。当我试图下载之前作为BLOB上传到MySQL DB的文件时,该文件正在下载,但是该文件不再可读。有什么解决办法吗 以下是我用于将文件作为字节数组上载到DB的代码: HTML和Javascript: Web API: 编辑: 现在还有另一个问题,情况是: 当我上传PDF文件并将其下载为PDF时,它可以
- HTML和Javascript:
- Web API:
- 当我上传PDF文件并将其下载为PDF时,它可以被下载,内容与我之前上传的内容相同,但是当我尝试将其下载为Word时,它正在被下载,但内容都是十六进制字符
- 当我上传Word文件并将其作为PDF下载时,它无法下载(文件已损坏),而当我将其作为Word下载时,它正在下载,但内容都是十六进制字符
非常感谢我想您可以将
下载PDF()
更改为:
public ActionResult DownloadPDF()
{
byte[] FileContent = RetrieveFileContentFromMySQLDB();
Response.Clear();
Response.Buffer = true;
Response.AddHeader("Content-Disposition", $"attachment;filename=File.pdf");
Response.Charset = string.Empty;
Response.ContentType = "application/pdf";
Response.Output.Write(Encoding.Default.GetString(FileContent, 0, FileContent.Length));
Response.Flush();
Response.End();
break;
}
以上内容(几乎)与
DownloadWord()
相同。区别在于标题“内容配置”和“内容类型”。我认为您可以将下载PDF()
更改为:
public ActionResult DownloadPDF()
{
byte[] FileContent = RetrieveFileContentFromMySQLDB();
Response.Clear();
Response.Buffer = true;
Response.AddHeader("Content-Disposition", $"attachment;filename=File.pdf");
Response.Charset = string.Empty;
Response.ContentType = "application/pdf";
Response.Output.Write(Encoding.Default.GetString(FileContent, 0, FileContent.Length));
Response.Flush();
Response.End();
break;
}
以上内容(几乎)与
DownloadWord()
相同。区别在于标题“Content Disposition”和“Content Type”。您能否显示MySQL在选择blob时返回的左侧(十六进制(id),16)
,以验证PDF是否正确存储?(请参阅:)由于可能的BOM,长度为16以显示8个字节。您好@Luuk,这是我尝试选择LEFT(HEX(FileContent),16)
时的数据,FileContent
是LONGBLOB
数据类型:504B030414000600I希望504446
位于该字符串中,因此我认为您的PDF存储不正确,这将使阅读变得困难。。。Hi@Luuk,对不起,刚才我上传了一个不是PDF的,在我上传了PDF并在MySQL中选择了语句之后,这里是数据:25504462D312E34OK,结论是PDF似乎正确地存储在MySQL中,因为第一个字节显示为“%PDF”,或者是十六进制26504446
。您能显示左侧(十六进制(id),16)
当选择blob时,MySQL将返回该数据,以验证PDF是否正确存储?(请参阅:)由于可能的BOM,长度为16以显示8个字节。您好@Luuk,这是我尝试选择LEFT(HEX(FileContent),16)
时的数据,FileContent
是LONGBLOB
数据类型:504B030414000600I希望504446
位于该字符串中,因此我认为您的PDF存储不正确,这将使阅读变得困难。。。Hi@Luuk,对不起,刚才我上传了一个不是PDF的,在我上传PDF并选择MySQL中的语句后,这里是数据:25504462D312E34OK,结论是PDF似乎正确地存储在MySQL中,因为第一个字节显示为“%PDF”,或者十六进制26504446
。Hi@Luuk,我已经尝试了上述解决方案,用于DownloadPDF()
,但是它没有按预期工作(文件正在下载,但是它只是显示白色页面,即使我上载了包含内容而不是白色页面的文件(PDF))。现在还有另一个问题:-当我用.doc或.docx上传文件并以PDF格式下载文件时,文件正在下载,但无法打开(文件已损坏),当我以Word格式下载文件时也是如此,文件正在下载,但内容与所有十六进制字符一样。有关更多信息,请参考我编辑的上述问题仅存储PDF文件,然后下载它“因为Word”不会转换文档。同时存储Word文件,然后下载为“PDF”不会转换它!您好@luk,非常感谢,您知道任何转换方法吗?有许多不同的工具可以将Word文档转换为PDF。从PDF到Word更难,因为有些PDF文档只包含图像,很难转换为WordHi@Luuk,好的,我会解决这个问题,将文件扩展名存储到DB中,一旦用户想要下载到另一个数据库中(假设:存储了Word扩展名,用户单击下载为PDF),然后我将从Word转换为HTML,然后再将其转换回PDF,反之亦然。这样做就可以了吗?您好@Luuk,我已经尝试了上述解决方案,用于DownloadPDF()
,但是它没有按预期工作(文件正在下载,但是它只是显示白色页面,即使我上传的文件(PDF)包含内容而不是白色页面)。现在还有另一个问题:-当我用.doc或.docx上传文件并以PDF格式下载文件时,文件正在下载,但无法打开(文件已损坏),当我以Word格式下载文件时也是如此,文件正在下载,但内容与所有十六进制字符一样。有关更多信息,请参考我编辑的上述问题仅存储PDF文件,然后下载它“因为Word”不会转换文档。同时存储Word文件,然后下载为“PDF”不会转换它!您好@luk,非常感谢,您知道任何转换方法吗?有许多不同的工具可以将Word文档转换为PDF。从PDF到Word更难,因为有些PDF文档只包含图像,很难转换为WordHi@Luuk,好的,我会解决这个问题,将文件扩展名存储到DB中,一旦用户想要下载到另一个数据库中(假设:存储了Word扩展名,用户单击下载为PDF),然后,我将执行从Word到HTML的转换
[HttpPost]
public ActionResult UploadFile()
{
if (Request.Files.Count <= 0)
return Ok();
byte[] FileContent = new byte[0];
using (var reader = new BinaryReader(Request.Files[0].InputStream))
FileContent = reader.ReadBytes(Request.Files[0].ContentLength);
InsertToMySQLDB(FileContent);
return Ok()
}
public ActionResult DownloadPDF()
{
byte[] FileContent = RetrieveFileContentFromMySQLDB();
return File(FileContent, "application/pdf", "File.pdf");
}
public ActionResult DownloadWord()
{
byte[] FileContent = RetrieveFileContentFromMySQLDB();
Response.Clear();
Response.Buffer = true;
Response.AddHeader("Content-Disposition", $"attachment;filename=File.doc");
Response.Charset = string.Empty;
Response.ContentType = "application/vnd.ms-word";
Response.Output.Write(Encoding.Default.GetString(FileContent, 0, FileContent.Length));
Response.Flush();
Response.End();
break;
)
public ActionResult DownloadPDF()
{
byte[] FileContent = RetrieveFileContentFromMySQLDB();
Response.Clear();
Response.Buffer = true;
Response.AddHeader("Content-Disposition", $"attachment;filename=File.pdf");
Response.Charset = string.Empty;
Response.ContentType = "application/pdf";
Response.Output.Write(Encoding.Default.GetString(FileContent, 0, FileContent.Length));
Response.Flush();
Response.End();
break;
}