web-dev-qa-db-fra.com

Envoyer un fichier dans JSONObject à REST Service Web

Je veux envoyer un fichier à webservice, mais j'ai besoin d'envoyer plus d'informations, alors je veux les envoyer avec un JSON. Mais quand je mets un fichier dans mon jsonObject, je reçois une erreur disant que ce n'est pas une chaîne. Ma question est, devrais-je prendre mon fichier et convertir en une chaîne, puis mettre dans mon json et sur le service Web le prendre et convertir cette chaîne en un fichier? Ou existe-t-il un autre moyen simple?

Voici mon code:

Client:

private void send() throws JSONException{
    ClientConfig config = new DefaultClientConfig();
    Client client = Client.create(config);
    client.addFilter(new LoggingFilter());
    WebResource service = client.resource("http://localhost:8080/proj/rest/file/upload_json");

    JSONObject my_data = new JSONObject();
    File file_upload = new File("C:/hi.txt");
    my_data.put("User", "Beth");
    my_data.put("Date", "22-07-2013");
    my_data.put("File", file_upload);

    ClientResponse client_response = service.accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, my_data);

    System.out.println("Status: "+client_response.getStatus());

    client.destroy();
}

Service Web

@POST
@Path("/upload_json")

@Consumes(MediaType.APPLICATION_JSON)
@Produces("text/plain")

public String receive(JSONObject json) throws JSONException {

    //Here I'll save my file and make antoher things..
    return "ok";
}

Après toutes les réponses, voici mon code - merci à tous:

Service Web

import Java.io.File;
import Java.io.FileOutputStream;
import Java.io.IOException;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import com.Sun.jersey.core.util.Base64;

@Path("/file")
public class ReceiveJSONWebService {

    @POST
    @Path("/upload_json")

    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)

    public JSONObject receiveJSON(JSONObject json) throws JSONException, IOException {
        convertFile(json.getString("file"), json.getString("file_name"));
        //Prints my json object
        return json;
    }

    //Convert a Base64 string and create a file
    private void convertFile(String file_string, String file_name) throws IOException{
        byte[] bytes = Base64.decode(file_string);
        File file = new File("local_path/"+file_name);
        FileOutputStream fop = new FileOutputStream(file);
        fop.write(bytes);
        fop.flush();
        fop.close();
    }
}

Client

import Java.io.File;
import Java.io.IOException;
import Java.nio.file.Files;
import javax.ws.rs.core.MediaType;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import com.Sun.jersey.api.client.Client;
import com.Sun.jersey.api.client.ClientResponse;
import com.Sun.jersey.api.client.WebResource;
import com.Sun.jersey.api.client.config.ClientConfig;
import com.Sun.jersey.api.client.config.DefaultClientConfig;
import com.Sun.jersey.api.client.filter.LoggingFilter;
import com.Sun.jersey.core.util.Base64;
import com.Sun.jersey.multipart.FormDataMultiPart;
import com.Sun.jersey.multipart.file.FileDataBodyPart;
import com.Sun.jersey.multipart.impl.MultiPartWriter;

public class MyClient {


    public static void main(String[] args) throws JSONException, IOException 
    {
        MyClient my_client = new MyClient();
        File file_upload = new File("local_file/file_name.pdf");
        my_client.sendFileJSON(file_upload);
    }


    private void sendFileJSON(File file_upload) throws JSONException, IOException{

        ClientConfig config = new DefaultClientConfig();
        Client client = Client.create(config);
        client.addFilter(new LoggingFilter());
        WebResource service = client.resource("my_rest_address_path");
        JSONObject data_file = new JSONObject();
        data_file.put("file_name", file_upload.getName());
        data_file.put("description", "Something about my file....");
        data_file.put("file", convertFileToString(file_upload));

        ClientResponse client_response = service.accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, data_file);

        System.out.println("Status: "+client_response.getStatus());

        client.destroy();

    }


    //Convert my file to a Base64 String
    private String convertFileToString(File file) throws IOException{
        byte[] bytes = Files.readAllBytes(file.toPath());   
        return new String(Base64.encode(bytes));
    }

}
18
user2486187

Vous devez convertir les données du fichier en encodage Base64, puis les transférer, par exemple. comme ça:

byte[] bytes = Files.readAllBytes(file_upload.toPath());
dados.put("File", DatatypeConverter.printBase64Binary(bytes));
8
Moritz Petersen
@POST
@Path("/uploadWeb")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadWeb(  @FormDataMultiPart("image")     InputStream uploadedInputStream,
                @FormDataParam("image")     FormDataContentDisposition fileDetail ) {

    int read = 0;
    byte[] bytes = new byte[1024];
    while ((read = uploadedInputStream.read(bytes)) != -1)
        System.out.write(bytes, 0, read);
    return Response.status(HttpStatus.SC_OK).entity(c).build();
 }

et du côté client ( voir cet article) :

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
FileBody fileContent= new FileBody(new File(fileName));
StringBody comment = new StringBody("Filename: " + fileName);
MultipartEntity reqEntity = new MultipartEntity();
reqEntity.addPart("file", fileContent);
httppost.setEntity(reqEntity);
HttpResponse response = httpclient.execute(httppost);
HttpEntity resEntity = response.getEntity();
2
moshe beeri

Je sais que c’est un vieux post, mais j’ai juste pensé ajouter un peu pour éviter la dépendance aux bibliothèques externes.

//Convert my file to a Base64 String
public static final String convertFileToString(File file) throws IOException{
   byte[] bytes = Files.readAllBytes(file.toPath());   
   return new String(Base64.getEncoder().encode(bytes));
}

//Convert a Base64 string and create a file
public static final void convertFile(String file_string, String file_name) throws IOException{
   byte[] bytes = Base64.getDecoder().decode(file_string);
   File file = new File("local_path/"+file_name);
   FileOutputStream fop = new FileOutputStream(file);
   fop.write(bytes);
   fop.flush();
   fop.close();
}
1
Palmeta

Je ne sais pas de quoi dados fait référence, peut-être un Map<String, String>, mais je pense que vous voulez utiliser la JSONObject que vous venez de créer.

JSONObject my_data = new JSONObject();
File file_upload = new File("C:/hi.txt");
my_data.put("User", "Beth");
my_data.put("Date", "22-07-2013");
my_data.put("File", file_upload);

Cependant, cela est inutile et pourrait ne pas faire ce que vous pensez. Un objet File ne contient pas de fichier, il contient le chemin d'accès au fichier, c'est-à-dire. C:/hi.txt. Si c'est ce que vous mettez dans votre JSON, cela produira

{"File" : "C:/hi.txt"}

Il ne contiendra pas le contenu du fichier.

Donc, vous pourriez aussi bien mettre le chemin du fichier directement

JSONObject my_data = new JSONObject();
my_data.put("User", "Beth");
my_data.put("Date", "22-07-2013");
my_data.put("File", "C:/hi.txt");

Si vous essayez de télécharger un fichier avec JSON, vous pouvez notamment lire les octets du fichier avec le NIO de Java 7.

byte[] bytes = Files.readAllBytes(file_upload .toPath());

Base64 code ces octets et les écrit sous forme de chaîne dans JSONObject. Utilisation du codec Apache Commons

Base64.encodeBase64(bytes);
my_data.put("File", new String(bytes));
0

Veuillez changer l’adresse de la machine de localhost en adresse IP à laquelle vous voulez que votre client se connecte pour appeler en dessous du service mentionné.

**CLIENT TO CALL REST WEBSERVICE**


    package in.india.client.downloadfiledemo;

    import Java.io.BufferedInputStream;
    import Java.io.File;
    import Java.io.FileInputStream;
    import Java.io.FileNotFoundException;
    import Java.io.FileOutputStream;
    import Java.io.IOException;

    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.core.Response.Status;

    import com.Sun.jersey.api.client.Client;
    import com.Sun.jersey.api.client.ClientHandlerException;
    import com.Sun.jersey.api.client.ClientResponse;
    import com.Sun.jersey.api.client.UniformInterfaceException;
    import com.Sun.jersey.api.client.WebResource;
    import com.Sun.jersey.multipart.BodyPart;
    import com.Sun.jersey.multipart.MultiPart;

    public class DownloadFileClient {

        private static final String BASE_URI = "http://localhost:8080/DownloadFileDemo/services/downloadfile";

        public DownloadFileClient() {

            try {
                Client client = Client.create();
                WebResource objWebResource = client.resource(BASE_URI);
                ClientResponse response = objWebResource.path("/")
                        .type(MediaType.TEXT_HTML).get(ClientResponse.class);

                System.out.println("response : " + response);
                if (response.getStatus() == Status.OK.getStatusCode()
                        && response.hasEntity()) {
                    MultiPart objMultiPart = response.getEntity(MultiPart.class);
                    Java.util.List<BodyPart> listBodyPart = objMultiPart
                            .getBodyParts();
                    BodyPart filenameBodyPart = listBodyPart.get(0);
                    BodyPart fileLengthBodyPart = listBodyPart.get(1);
                    BodyPart fileBodyPart = listBodyPart.get(2);

                    String filename = filenameBodyPart.getEntityAs(String.class);
                    String fileLength = fileLengthBodyPart
                            .getEntityAs(String.class);
                    File streamedFile = fileBodyPart.getEntityAs(File.class);

                    BufferedInputStream objBufferedInputStream = new BufferedInputStream(
                            new FileInputStream(streamedFile));

                    byte[] bytes = new byte[objBufferedInputStream.available()];

                    objBufferedInputStream.read(bytes);

                    String outFileName = "D:/"
                            + filename;
                    System.out.println("File name is : " + filename
                            + " and length is : " + fileLength);
                    FileOutputStream objFileOutputStream = new FileOutputStream(
                            outFileName);
                    objFileOutputStream.write(bytes);
                    objFileOutputStream.close();
                    objBufferedInputStream.close();
                    File receivedFile = new File(outFileName);
                    System.out.print("Is the file size is same? :\t");
                    System.out.println(Long.parseLong(fileLength) == receivedFile
                            .length());
                }
            } catch (UniformInterfaceException e) {
                e.printStackTrace();
            } catch (ClientHandlerException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

        public static void main(String... args) {
            new DownloadFileClient();
        }

    }


**SERVICE TO RESPONSE CLIENT** 

package in.india.service.downloadfiledemo;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import com.Sun.jersey.multipart.MultiPart;

@Path("downloadfile")
@Produces("multipart/mixed")
public class DownloadFileResource {

    @GET
    public Response getFile() {

        Java.io.File objFile = new Java.io.File(
                "D:/DanGilbert_2004-480p-en.mp4");
        MultiPart objMultiPart = new MultiPart();
        objMultiPart.type(new MediaType("multipart", "mixed"));
        objMultiPart
                .bodyPart(objFile.getName(), new MediaType("text", "plain"));
        objMultiPart.bodyPart("" + objFile.length(), new MediaType("text",
                "plain"));
        objMultiPart.bodyPart(objFile, new MediaType("multipart", "mixed"));

        return Response.ok(objMultiPart).build();

    }

}

**JAR NEEDED** 

jersey-bundle-1.14.jar
jersey-multipart-1.14.jar
mimepull.jar

**WEB.XML**


<?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" xmlns:web="http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>DownloadFileDemo</display-name>
    <servlet>
        <display-name>JAX-RS REST Servlet</display-name>
        <servlet-name>JAX-RS REST Servlet</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>in.india.service.downloadfiledemo</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>JAX-RS REST Servlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>
0