Загрузка файла Java с ошибкой внутреннего сервера REST

#java #web-services #rest #servlets #jboss

#java #веб-службы #rest #сервлеты #jboss

Вопрос:

У меня есть сервер и клиент, где я пытаюсь загрузить файл с клиента на сервер, и я получаю следующую ошибку: Response: Internal Server Error

Ниже приведен мой код

     public static void main(String[] args) throws FileNotFoundException{    
        try{
            ClientConfig config = new DefaultClientConfig();

            config.getClasses().add(MultiPartWriter.class);
            Client client = Client.create(config);



            WebResource resource = client.resource("http://localhost:8080/de.ServerReceiver/rest/upload");

            File f = new File("C:/1.txt");          
            FileInputStream fs = new FileInputStream(f);
            byte[] con = new byte[(int)f.length()];

            fs.read(con);
            FormDataMultiPart form1 = new FormDataMultiPart();

            FormDataBodyPart fdp = new FormDataBodyPart("content", MediaType.MULTIPART_FORM_DATA);
            form1.bodyPart(fdp);


            String response = resource.type(MediaType.MULTIPART_FORM_DATA).post(String.class, form1);
        } 
        catch (Exception e) { e.printStackTrace(); 
            }
        }
}
  

Сервер:

 @Path("/upload")

public class Server {

    private static final String SERVER_UPLOAD_LOCATION_FOLDER = "C://";

    @POST
    @Consumes(MediaType.MULTIPART_FORM_DATA)

    public Response uploadFile(
            @FormDataParam("file") InputStream fileInputStream,
            @FormDataParam("file") FormDataContentDisposition contentDispositionHeader) {



        String filePath = "C://"   contentDispositionHeader.getFileName();

        // save the file to the server
        saveFile(fileInputStream, filePath);

        String output = "File saved to server location : "   filePath;

        return Response.status(200).entity(output).build();

    }

    // save uploaded file to a defined location on the server

    private void saveFile(InputStream uploadedInputStream, String serverLocation) {

        try {
            OutputStream outpuStream = new FileOutputStream(new File(serverLocation));
            int read = 0;
            byte[] bytes = new byte[1024];

            outpuStream = new FileOutputStream(new File(serverLocation));
            while ((read = uploadedInputStream.read(bytes)) != -1) {
                outpuStream.write(bytes, 0, read);
            }
            outpuStream.flush();
            outpuStream.close();
        } catch (IOException e) {

            e.printStackTrace();
        }
    }
}
  

Вот web.xml , как вы можете видеть, я установил URL-шаблон в /rest/*

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>de.ServerReceiver</display-name>

  <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>de.ServerReceiver</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>
  

Клиент пытается подключиться к серверу, используя следующий uri: 'http://localhost:8080/de.ServerReceiver/rest/upload'

Я получаю следующую ошибку :

 sdadacom.sun.jersey.api.client.UniformInterfaceException: POST http://localhost:8080/de.ServerReceiver/rest/upload returned a response status of 500 Internal Server Error
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:688)
    at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
    at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:570)
    at de.ClientSide.ClientSide.main(ClientSide.java:82)
  

Пожалуйста, помогите мне.

Спасибо

Комментарии:

1. Проверьте журнал. Причина ошибки сервера регистрируется там.

Ответ №1:

Если вы сделаете это:

 outpuStream = new FileOutputStream(new File("C://"));
  

Это означает, что вы хотите сохранить полученный файл как «C: //», что не имеет смысла, потому что «C: //» — это каталог, а не файл.

Комментарии:

1. Вы правы в этом, я исправил это, но проблема все еще остается. Я не могу подключиться к серверу

2. Пожалуйста, обновите вопрос новой ошибкой, которую вы видите. Есть ли у вас трассировка стека исключений на стороне сервера?

3. Ошибка та же. В клиентской части, если вы проверяете, у меня есть это: System.out.println(«Ответ: » clientResp.getClientResponseStatus()); … Выводится следующее: Ответ: внутренняя ошибка сервера… Я не могу подключиться к серверу.

4. Можно ли распечатать содержимое переменной serverLocation в saveFile методе?

5. Поскольку это строка, да, я делал это много раз. Я изменил часть клиента и обновил сообщение с ошибкой. Ошибка находится в конце