簡體   English   中英

Azure 邏輯應用程序:PDF 文件在通過 http WebAPI 文件上傳發送時損壞

[英]Azure Logic Apps: PDF files get corrupted when sent via http WebAPI file upload

我正在使用邏輯應用程序調用自定義 Web API 來上傳存儲在 blob 存儲上的 PDF。 我可以通過郵遞員直接調用端點,一切正常 - 即通過郵遞員上傳 PDF 文件,文件被正確保存,我可以打開文件。

當我嘗試在邏輯應用程序中復制請求時,看起來一切正常 - 這意味着 blob 存儲 PDF 文件可以正常上傳並通過 webapi 正確保存,但它們以某種方式損壞 - ADOBE 閱讀器錯誤消息。 當我比較原始 PDF 文件 - 在記事本中打開和 WebAPI 保存/上傳的 PDF 文件(在記事本中打開)時,我確實在 PDF 中發現了一些不同的符號,這使上傳的文件損壞(請參閱 ???? 正文中的文本)。

關於導致此問題的原因以及如何解決它的任何想法?

WebAPI 請求正文:

{ "$content-type": "multipart/form-data", "$multipart": [ { "body": "%PDF-1.5\\n% \\n1 0 obj\\n<</Type/ Font/Subtype/Type1/BaseFont/Times-Roman/Encoding/WinAnsiEncoding>>\\nendobj\\n2 0 obj\\n<</Type/Font/Subtype/Type1/BaseFont/Times-Bold/Encoding/WinAnsiEncoding>>\\nendobj\\ n3 0 obj\\n<</Type/Page/Contents 4 0 R/Resources<</Font<</F3 5 0 R/F2 2 0 R/F1 1 0 R>>/ProcSet[/PDF/Text/ImageB /ImageC/ImageI]>>/Parent 6 0 R/MediaBox[0 0 612 792]>>\\nendobj\\n5 0 obj\\n<</Type/Font/Subtype/Type1/BaseFont/Helvetica/Encoding/WinAnsiEncoding>> \\nendobj\\n4 0 obj\\n<</Length 736/Filter/FlateDecode>>stream\\nx ]O 0\ + %H \ J\\\n\\ u001ak ۸@BYkP &)I Ŀ S>\R tZo X >> <Dg& b\\nf \p 78g@ ]tD ͯ D_ \ t P G\I wD0C\\ q(" \ o h >w g \\\K \\ u0014 J n 7 e lk :}Vq IxG T!҇Hg \ <Iaa t\ f ,\'p9\ \ X @ m i< 8 H \ QL 1P)?\\t ~ \ j !\ H غ} q Pn {2 \% SIb , \ \ & \ \\t kP + \\u00\u003c/em> 1f \\i ]T , ?F \b^ I \I\\bR G\ nPO|A 8+s Imm ! #\\^w7 補 6YٓBaİ un m :1 v\\# % &PҴy U #'\\b9 \ \% K\q /\\ L@P Kɠ n k\\r\H \ =\#\\ 珏i\\n 'Qz y HOaI4>@ h\\ u000eXKʅ dl| 8 H \M ic _ ]YUq \y qVd G <v\#p;[\ l e $ \z@1 \Bw- ƪuPLؙW)A\\81~)ԕug \ZR \&I? \ O %\~ \v H h ر â1 \ l y\\r. \ \G支付 P vg\ Դ\\b \ĽWƱW rA \bo : Z ʛ +( A 닙 /)w\\fB 2R۸ yU\\ ~t \ - ]{b \# 1 隨 \L \ ; > ~\ 1" G:_T \域 \\nendstream\\nendobj \\n6 0 obj\\n<</Type/Pages/Count 3/Kids[3 0 R 7 0 R 8 0 R]/ITXT(4.1.6)>>\\nendobj\\n7 0 obj\\n<</Type/頁面/內容 9 0 R/Resources<</Font<</F3 5 0 R/F2 2 0 R/F1 1 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Parent 6 0 R/MediaBox[0 0 612 792]>>\\nendobj\\n9 0 obj\\n<</Length 494/Filter/FlateDecode>>stream\\nx Oo @\ \s Hư;鴻 Bh *\pn " \ v 5 \* IN ˾ μ c ) \hK \ |\\f b n G4 q{ D q\ \\ @\ p\\ 5\ \\G\ΆfH X X7 \ \ # :\\u\H\\n$ B - s i 7\\ Y u7( \ Ɂ 9tITu^ +f1 l> ,\ bv3} \ \e A\ J Ә@\ m n ZTq\ t\ uVT aqB+\ c ;\=\\- / k SԶ^\ \\" Z z\- \ tTKd z \\r \0N y i e Wq+P\ \\Sl P Q |\& \\n\d d !<S y@ Rs I 1 fg UU ²N Y { \\nkH˚\=[ 4 9 q\|\ =rA B 'y \ \ g> )oΧt\ d\\b s\\b Py ߔ ~d( 2 \ jDƃ0 \\n\@x#n] t ~ F & \ O8 \ \ \\n q\\nendstream\\nendobj\\n8 0 obj\\n<</Type/Page/Contents 10 0 R/Resources<</Font<</F3 5 0 R/F2 2 0 R/F1 1 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Parent 6 0 R/MediaBox[0 0 612 792]>>\\nendobj\\n10 0 obj\\n<</Length 798/Filter/FlateDecode>>stream\\nx [s @\ \{ ̘ κ\ w&\ i XC P X2\\b\ȡ \ I - \\\\ \ A\ \\" \\\nbuB C # \ \?\ q ;\=\\- / k SԶ^\ \\" Z z\- \ tTKd z \\r \0N y i e Wq+P\ \\Sl P Q |\& \\n\d d !<S y@ Rs I 1 fg UU ²N Y { \\nkH˚\=[ 4 9 q\|\ =rA B 'y \ \ g> )oΧt\ d\\b s\\b Py ߔ ~d( 2 \ jDƃ0 \\n\@x#n] t ~ F & \ O8 \ \ \\n q\\nendstream\\nendobj\\n8 0 obj\\n<</Type/Page/Contents 10 0 R/Resources<</Font<</F3 5 0 R/F2 2 0 R/F1 1 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Parent 6 0 R/MediaBox[0 0 612 792]>>\\nendobj\\n10 0 obj\\n<</Length 798/Filter/FlateDecode>>stream\\nx [s @\ \{ ̘ κ\ w&\ i XC P X2\\b\ȡ \ I - \\\\ \ A\ \\" \\\nbuB C # \ \?\ q o n \\t z(X \\bE \ \\- V g \\rcY\ ą\ y0b\. \ \fs ȵ \\ {¸ UXI4| \\n\E \ ] \\ h;\;\\f\ /׳ x~{\̯ +\\na\ \ r An^\FP b \ \#կ~ $ ƹ 7 6 . 2ɲ$[ Y D\\ } 8 \ b\ \SS 0[ \ \ \\Ӽ | z\Q \ w g7 \\ ,^ F w<Y Q %R [h \V \ \ f|q± m !X ,\\ }\\rîm30 !\\V0 \ U^ ) \M\ rq\ F \ 1' \\\\3 a \i 枦g\ 2 k[ \ ðozE : z ^ HƏQ Ju3ݦTܯ + \ /zQ $\ H r- . \\f Պw 9 m \[ @m \Y\ 9 њ\B ̡\; \s \FE^ (Lլ 0k\\t߯ \ \ &\ ۃ5 n \CL |A ERƉ ' P)+ \ E <L \\b 3q\~ ˱\ 8x 1 m \ ƀ Ɯ h \!Fc Y i 6 \\b #G S * ~ 5 ] TS ,A C\\t 4n\\u00\u003c/em> 1fD B \ \ \ \ I V;\b \L e $ b[ \ \s0 n ; \ Wa,\\rK\ X; \-\\f\ \\ \Bu \Dk\ 0 \ 】i\3 F G ) \\b : \ E ~\\nendstream\\nendobj\\n11 0 obj\\n[3 0 R/XYZ 0 804 0]\\nendobj\\n12 0 obj\\n[7 0 R /XYZ 0 804 0]\\nendobj\\n13 0 obj\\n[8 0 R/XYZ 0 804 0]\\nendobj\\n14 0 obj\\n<</Names[(1) 11 0 R(2) 12 0 R( 3) 13 0 R]>>\\nendobj\\n15 0 obj\\n<</Dests 14 0 R>>\\nendobj\\n16 0 obj\\n<</Type/Catalog/Pages 6 0 R/Names 15 0 R> >\\nendobj\\n17 0 obj\\n<</Title(Estimate Audit)/Creator(Xactimate 28.300.20080.36805)/Producer(iTextSharp 4.1.6 by 1T3XT)/CreationDate(D:2020100810441000) d:20201008084230-06'00' )>> \\ nendobj \\ nxref \\ N0 18 \\ n0000000000 65535˚F\\ n0000000015 00000ñ\\ n0000000105 00000ñ\\ n0000000194 00000ñ\\ n0000000452 00000ñ\\ n0000000364 00000ñ\\ n0000001255 00000ñ\\ n0000001330 00000ñ \\n0000002061 00000 n \\n0000001500 00000 n \\n0000002232 00000 n \\n0000003098 00000 n \\n0000003134 00000 n 007 01 0000否\\ n0000003206 00000Ñ\\ n0000003265 00000Ñ\\ n0000003299 00000Ñ\\ n0000003358 00000Ñ\\ ntrailer \\ n << /尺寸18/17信息0 R / ID [<7b2a85db783c2dfe11911d8bdba318eb> <4e585c7bf06c8a42fc07c328cf0f0f89>] /根16 0 R >> \\ nstartxref\\n3546\\n%%EOF\\n", "headers": { "Content-Disposition": "form-data; 名稱=“文件”; filename="/imagerightextract/Xactimate-Export-File-1.zip/ESTIMATE_AUDIT_REPORT.PDF"" } } ] }

以下圖片中的其他詳細信息。

邏輯應用程序快照

邏輯應用運行時快照

我一直在努力解決這個問題,但沒有明確的定義,但您可以嘗試使用 base64,將文件內容轉換為 base64。 通過直接在代碼中插入它,我取得了最大的成功。

我基本上遇到了同樣的問題,並且能夠讓它工作。

我按照以下文章中的建議配置了我的邏輯應用程序:

從 Azure 邏輯應用通過 HTTP 或 HTTPS 調用服務終結點

這實際上只是使用 json 來構建整個身體。 然后我在附件的 contentBytes 上使用了 base64ToBinary,因為我在調查中注意到以下代碼生成了一個可讀文件:

// Reads a text file with the base64 string I pulled from an Azure Logic App "inputs"
string requestBody = ReturnContent();
byte[] encodedBytes = Convert.FromBase64String(requestBody);
File.WriteAllBytes("C:\\<your_path>\\test.pdf", encodedBytes);

一旦我這樣做了,邏輯應用程序就會生成一個可讀文件。

我的 HTTP 操作:

在此處輸入圖片說明

請注意,在我使用 base64ToBinary 的代碼中,您看到“附件名稱”的位置。

"body": "@base64ToBinary(items('For_each')?['contentBytes'])"

我認為需要注意的是 multipart 部分中的 Content-Type 已被省略。 如果您查看實際請求,它會作為 application/octet-stream 進行處理,您不想覆蓋它...您也不必指定整個請求的 Content-Type... Logic Apps 也解決了這個問題。

我唯一需要克服的另一件事是文件名可能包含空格和其他通常使用 url 編碼的字符......因此,我建議您在正文中指定文件名,如下所示:

"headers": {
   "Content-Disposition": "form-data;name=fileData; filename=@{encodeURIComponent(items('For_each')?['name'])}"
}

另外值得注意的是,我的控制器方法(Asp.Net Core)有一個 IFormFile 參數......它的簽名如下所示:

[HttpPost("{cid}")]
[ProducesResponseType(typeof(bool), (int)HttpStatusCode.OK)]
public async Task<IActionResult> ProcessAttachment(string cid, IFormFile fileData)

我希望這對其他人有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM