.NET 8 Firebase Storage上传iText7生成PDF无法识别类型求助
解决iText7生成PDF上传Firebase Storage无法识别为PDF的问题
问题核心原因
Firebase Storage识别文件类型主要依赖两个关键依据:
- 文件名的后缀标识(如
.pdf) - 文件上传时指定的
Content-Type元数据
你的代码存在两处关键疏漏:
- 上传的文件名未添加
.pdf后缀 - 上传过程未显式指定
Content-Type为application/pdf,导致Firebase自动检测时可能误判文件类型
具体修复方案
1. 修改上传方法:添加文件名后缀并指定Content-Type
public async Task<string> UploadQRCode(Stream QRCode, string fileName) { try { // 给文件名添加.pdf后缀 String nameNew = $"{fileName}.pdf"; var task = new FirebaseStorage(_configuration["Firebase:ProjectId"], new FirebaseStorageOptions { ThrowOnCancel = true }).Child("QR Codes").Child(nameNew) // 显式设置文件的Content-Type为PDF类型 .PutAsync(QRCode, cancellationToken: default, new FirebaseStorageMetadata { ContentType = "application/pdf" }); var downloadURL = await task; return downloadURL; } catch (Exception e) { Console.WriteLine("Error uploading file: " + e.Message); throw; } }
2. 优化PDF生成的流处理(可选,避免潜在问题)
虽然当前生成逻辑基本正常,但可以添加流位置重置的操作,确保返回的字节数组完整:
public byte[] GenerateSurgicalInventoryQRCode(string categoryId, string itemId) { var url = $"{_configuration["BaseURL:Frontend"]}/mlt/inventorysurgical/{categoryId}/{itemId}"; QRCodeGenerator qrGenerator = new QRCodeGenerator(); QRCodeData qrCodeData = qrGenerator.CreateQrCode(url, QRCodeGenerator.ECCLevel.H); BitmapByteQRCode bitMap = new BitmapByteQRCode(qrCodeData); var QRCodeBytes = bitMap.GetGraphic(5); using var memoryStream = new MemoryStream(); var image = Image.FromStream(new MemoryStream(QRCodeBytes)); var width = image.Width; var height = image.Height; var pageSize = new PageSize(width, height); var pdfWriter = new PdfWriter(memoryStream); var pdfDocument = new PdfDocument(pdfWriter); var document = new Document(pdfDocument, pageSize); var imageData = new iText.Layout.Element.Image(iText.IO.Image.ImageDataFactory.Create(QRCodeBytes)); document.Add(imageData); document.Close(); // 重置流位置到起始点,确保ToArray()读取完整内容 memoryStream.Position = 0; return memoryStream.ToArray(); }
3. 控制器调用逻辑保持不变
控制器中的代码无需修改,因为后缀处理已经在上传方法中完成:
var surgicalInventoryId = _idGenerator.GenerateSurgicalInventoryId(); byte[] QRCode = _qrGenerator.GenerateSurgicalInventoryQRCode(newSurgicalItem.SurgicalCategoryID, surgicalInventoryId); var QRurl = await _storageService.UploadQRCode(new MemoryStream(QRCode), surgicalInventoryId);
验证方式
上传完成后,进入Firebase Storage控制台查看文件元数据:
- 确认文件名带有
.pdf后缀 - 确认
Content-Type字段显示为application/pdf
完成以上修改后,前端嵌入PDF时,浏览器就能正确识别文件类型并正常渲染。
内容的提问来源于stack exchange,提问作者Ann Gomez
相关产品推荐
相关产品推荐

