Загрузить два локально сохраненных PDF-файла в REST API - PullRequest
0 голосов
/ 18 марта 2019

У меня есть небольшой REST API, который берет два PDF и возвращает URL сравнения из Draftable API.API был протестирован и работает нормально.Поскольку я новичок в REST API и Angular, у меня возникают проблемы с выяснением того, как отправить два PDF в API.

Вот как я тестировал мой API: enter image description here

часть API:

@PostMapping("/draftableDemo")
    String compareJob(@RequestParam("file1") MultipartFile file1, @RequestParam("file2") MultipartFile file2) {
        CompareJob compareJob = new CompareJob(convert(file1), convert(file2));
        DraftableCompare draftableCompare = new DraftableCompare();
        return draftableCompare.compare(compareJob);
    }

Я нашел это ТАК сообщение , в котором были такие же проблемы, как и у меня.

  • Как определить два PDF-файла на угловой стороне с их представляющими ключами?
  • Должен ли я изменить то, что ожидает мой API?
  • I 'я всегда читаю о загрузчике файлов Angular, о каком модуле все говорят?

Спасибо за любые советы, идеи или предложения!

РЕДАКТИРОВАТЬ: Мой HTML:

<div class="content"
     fxLayout="row"
     fxLayout.xs="column"
     fxFlexFill>

    <div fxFlex="50" fxFlex.xs="50" style="position: relative">
        <div>
            <div>
                <p>
                    Open first PDF
                </p>
                <input (change)="onFileSelected(pdf1)" type="file" [multiple]="multiple" id="file1">
            </div>

            <div *ngIf="error" class="error mb">
                {{ error.message | json }}
            </div>

            <div *ngIf="!isLoaded && !error && progressData" id="progress1">
                <div class="bg">
                    <div class="bar" [style.width]="progressData.loaded / progressData.total * 100 + '%'"></div>
                </div>
                <span>{{ getInt(progressData.loaded / progressData.total * 100) }}%</span>
            </div>

            <pdf-viewer [src]="pdfSrc1"
                        [(page)]="page"
                        [rotation]="rotation"
                        [original-size]="originalSize"
                        [fit-to-page]="fitToPage"
                        (after-load-complete)="afterLoadComplete($event)"
                        [zoom]="zoom"
                        [show-all]="showAll"
                        [stick-to-page]="stickToPage"
                        [render-text]="renderText"
                        [external-link-target]="'blank'"
                        [autoresize]="autoresize"
                        [render-text-mode]="renderTextMode"
                        (error)="onError($event)"
                        (on-progress)="onProgress($event)"
                        (page-rendered)="pageRendered($event)"
            ></pdf-viewer>
        </div>
    </div>

    <div fxFlex="50" style="position: relative">
        <div>
            <div>
                <p>
                    Open second PDF
                </p>
                <input (change)="onFileSelected(pdf2)" type="file" [multiple]="multiple" id="file2">
            </div>

            <div *ngIf="error" class="error mb">
                {{ error.message | json }}
            </div>

            <div *ngIf="!isLoaded && !error && progressData" id="progress2">
                <div class="bg">
                    <div class="bar" [style.width]="progressData.loaded / progressData.total * 100 + '%'"></div>
                </div>
                <span>{{ getInt(progressData.loaded / progressData.total * 100) }}%</span>
            </div>


            <pdf-viewer [src]="pdfSrc2"
                        [(page)]="page"
                        [rotation]="rotation"
                        [original-size]="originalSize"
                        [fit-to-page]="fitToPage"
                        (after-load-complete)="afterLoadComplete($event)"
                        [zoom]="zoom"
                        [show-all]="showAll"
                        [stick-to-page]="stickToPage"
                        [render-text]="renderText"
                        [external-link-target]="'blank'"
                        [autoresize]="autoresize"
                        [render-text-mode]="renderTextMode"
                        (error)="onError($event)"
                        (on-progress)="onProgress($event)"
                        (page-rendered)="pageRendered($event)"
            ></pdf-viewer>
        </div>
    </div>

</div>




<hr>
<input type="file" [multiple]="multiple" #fileInput>
<file-upload #fu (change)="fu.upload()" [multiple]="true"></file-upload>
<div class="example-button-row">
    <button mat-raised-button color="primary" routerLink="/draftable" (click)="compareDraftable()">Draftable</button>
    <button mat-raised-button color="primary" routerLink="/pdfcompare">PDF compare</button>
    <button mat-raised-button color="primary">Version3</button>
    <button mat-raised-button color="primary">Version4</button>
</div>

И ТС:

export class MainComponent implements OnInit {
    // pdfSrc1: string | PDFSource | ArrayBuffer = './assets/fullText2Page.pdf';
    // pdfSrc2: string | PDFSource | ArrayBuffer = './assets/fullText1Page.pdf';

    leftFile: File = null;
    rightFile: File = null;

    @Input() multiple = true;
    @ViewChild('fileInput') inputEl: ElementRef;

    constructor(private http: HttpClient) {
    }

    pdfSrc1: string | PDFSource | ArrayBuffer = '';
    pdfSrc2: string | PDFSource | ArrayBuffer = '';

    pdf1 = 'pdfSrc1';
    pdf2 = 'pdfSrc2';

    error: any;
    page = 1;
    rotation = 0;
    zoom = 1;
    originalSize = false;
    pdf: any;
    renderText = true;
    progressData: PDFProgressData;
    isLoaded = false;
    stickToPage = false;
    showAll = true;
    autoresize = true;
    fitToPage = false;
    outline: any[];
    renderTextMode = 2;

    @ViewChild(PdfViewerComponent) private pdfComponent: PdfViewerComponent;

    ngOnInit(): void {
    }



    /**
     * Render PDF preview on selecting file
     */
    onFileSelected(pdfSource) {
        console.log('Source: ', pdfSource);
        let $pdf: any;

        if (pdfSource === 'pdfSrc1') {
            $pdf = document.querySelector('#file1');
        } else {
            $pdf = document.querySelector('#file2');
        }

        if (typeof FileReader !== 'undefined') {
            const reader = new FileReader();

            reader.onload = (e: any) => {
                if (pdfSource === 'pdfSrc1') {
                    this.pdfSrc1 = e.target.result;
                } else {
                    this.pdfSrc2 = e.target.result;
                }

            };

            reader.readAsArrayBuffer($pdf.files[0]);
        }
    }

    /**
     * Get pdf information after it's loaded
     */
    afterLoadComplete(pdf: PDFDocumentProxy) {
        this.pdf = pdf;
        this.isLoaded = true;
        this.loadOutline();
    }

    /**
     * Get outline
     */
    loadOutline() {
        this.pdf.getOutline().then((outline: any[]) => {
            this.outline = outline;
        });
    }

    /**
     * Handle error callback
     */
    onError(error: any) {
        this.error = error; // set error
    }


    /**
     * Pdf loading progress callback
     */
    onProgress(progressData: PDFProgressData) {
        // console.log('Progress Data: ', progressData);
        this.progressData = progressData;
        this.isLoaded = false;
        this.error = null; // clear error
    }

    getInt(value: number): number {
        return Math.round(value);
    }

    /**
     * Page rendered callback, which is called when a page is rendered (called multiple times)
     */
    pageRendered(e: CustomEvent) {
        // console.log('(page-rendered)', e);
    }

    compareDraftable() {
        const fd = new FormData();
        fd.append('file1', this.leftFile, this.leftFile.name);
        this.http.post('localhost:8080/draftableDemo', fd)
            .subscribe(res => {
                console.log(res);
            });
    }

    upload() {
        const inputEl: HTMLInputElement = this.inputEl.nativeElement;
        const fileCount: number = inputEl.files.length;
        const formData = new FormData();
        if (fileCount > 0) { // a file was selected
            for (let i = 0; i < fileCount; i++) {
                formData.append('file[]', inputEl.files.item(i));
            }
            this.http
                .post('localhost:8080/draftableDemo', formData);
            // do whatever you do...
            // subscribe to observable to listen for response
        }
    }

1 Ответ

0 голосов
/ 19 марта 2019
  • Как определить два PDF-файла на угловой стороне с их символами?

В настоящее время у вас уже есть два файла, все, что вам нужно сделать, это отправить их с помощью запроса POST

let formData:FormData = new FormData();
formData.append('file1', this.pdfSrc1);
formData.append('file2', this.pdfSrc2);

const req = new HttpRequest('POST', 'localhost:8080/draftableDemo', formData);
  • Должен ли я изменить то, что ожидает мой API?

Поскольку formData отправляет PDF-файлы с точно такими же именами ключей, как и в PostMan, или с тем, что API ожидает, и если this.pdfSrc1 / this.pdfSrc2 имеют неправильный формат, все должно быть в порядке

  • Я всегда читаю загрузчик файлов Angular, о каком модуле все говорят?

Нет необходимости в угловом загрузчике файла или теге здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...