Как правильно отправить файл с помощью resteasy в angular? - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть текущая служба в приложении angular 5:

const httpOptions = {
  headers: new HttpHeaders({ 'Accept': 'application/json', 'Content-Type': 'multipart/form-data' })
};

@Injectable()
export class UploadService {

  constructor(private http: HttpClient) { }

  // file from event.target.files[0]
  uploadFile(url: string, file: File): Observable<any> {

    let formData = new FormData();    
    formData.append('upload', file, file.name);                
    return this.http.post(url, formData, httpOptions);        
  }
}

И у меня есть метод resteasy в приложении java:

@POST
@Path("MyThing/Pic")
@Consumes("multipart/form-data")
@Produces("application/json")
public void uploadImage(InputStream stream){

    try {
        byte[] buffer = new byte[stream.available()];
        stream.read(buffer);

        File targetFile = new File("xyz.png");
        OutputStream outStream = new FileOutputStream(targetFile);
        outStream.write(buffer);
        outStream.flush();
        outStream.close();
    } catch (IOException e) {
        // TODO throw!
        e.printStackTrace();
    }   
}

Проблема в том, что мне нужно знатьимя файла на стороне сервера, по крайней мере суффикс имени файла, который является типом файла.Если кто-то загружает JPEG, я хочу сохранить JPEG, а не PNG по умолчанию, например.Есть ли лучший способ отправить файл из 'multipart / form-data' и если да, каким должно быть определение метода на стороне сервера в этом случае?Спасибо!

1 Ответ

0 голосов
/ 13 ноября 2018

Я закончил загрузку двух файлов jars:

  1. Resteasy-многочастному-поставщик-1,1-RC2.jar
  2. почта-1.4.jar

Затем я использовал MultipartFormDataInput в uploadPhotomethod (остальные службы), посмотрите в обновленном методе:

@POST
    @Path("Company/Logo/{companyId}")
    @Consumes("multipart/form-data")
    @Produces("application/json")
    public Response  uploadPhoto(MultipartFormDataInput input){

        String fileName = "";       
        Map<String, InputPart> uploadForm = input.getFormData();
        InputPart inputPart = uploadForm.get("upload");
         try {

            MultivaluedMap<String, String> header = inputPart.getHeaders();
            fileName = getFileName(header);

            //convert the uploaded file to inputstream
            InputStream inputStream = inputPart.getBody(InputStream.class,null);

            byte [] bytes = IOUtils.toByteArray(inputStream);               
            //constructs upload file path           
            writeFile(bytes,fileName);                      

          } catch (IOException e) {
            e.printStackTrace();
          }

        return Response.status(200)
            .entity("uploadFile is called, Uploaded file name : " + fileName).build();
    }

И заголовок запроса в угловом виде выглядит так (удалено «Content-Type»: «multipart / form-data»).

const httpOptions = {
  headers: new HttpHeaders({ 'Accept': 'application/json' })
};

Я надеюсь, что это полезно для других!

...