Desidero inviare un file al servizio web, ma ho bisogno di inviare più informazioni, quindi voglio inviarle con un json. Ma quando metto un file dentro il mio jsonObject ottengo un errore che dice che non è una stringa. La mia domanda è: dovrei prendere il mio file e convertirlo in una stringa, quindi mettere dentro il mio json e sul servizio web prenderlo e convertirlo in un file? O c'è un altro modo semplice?Invia file all'interno di JSONObject a REST WebService
Ecco il mio codice:
Cliente:
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();
}
WebService
@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";
}
Dopo tutte le risposte, qui è il mio codice - grazie a tutti:
WebService
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));
}
}
Che tipo è "dados'? –
Mi dispiace ... ho dimenticato di cambiare il nome, ma dados = my_data – user2486187
Era pensato per essere Base64.getDecoder(). Decode (file_string) forse? –