Javascript 成功将文件上传到MySQL中的字节数组,但下载时内容不可读

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时,它可以

在使用JavaScript XMLHttpRequest中的FormData上传文件并连接到Web API并将其作为LONGBLOB数据类型保存到MySQL DB后,我在下载内容时遇到问题。当我试图下载之前作为BLOB上传到MySQL DB的文件时,该文件正在下载,但是该文件不再可读。有什么解决办法吗

以下是我用于将文件作为字节数组上载到DB的代码:

  • 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;
}