ファイルをウェブサービスに送信したいのですが、さらに情報を送信する必要があるため、jsonで送信したいと思います。しかし、jsonObject内にファイルを配置すると、文字列ではないというエラーが表示されます。私の質問は、ファイルを取得して文字列に変換し、jsonの内部に入れてWebサービスでそれを取得し、その文字列をファイルに変換する必要がありますか?または、別の簡単な方法はありますか?
ここに私のコードがあります:
クライアント:
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();
}
ウェブサービス
@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";
}
すべての答えの後、ここに私のコードがあります-みんなありがとう:
ウェブサービス
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();
}
}
クライアント
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));
}
}
ファイルデータをBase64エンコードに変換してから転送する必要があります。このような:
byte[] bytes = Files.readAllBytes(file_upload.toPath());
dados.put("File", DatatypeConverter.printBase64Binary(bytes));
@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();
}
およびクライアント側の( この投稿を参照) :
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();
私はその古い投稿を知っていますが、外部ライブラリへの依存を避けるために少し追加すると思いました。
//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();
}
dados
が何を指しているのかわかりません。おそらくMap<String, String>
が、作成したJSONObject
を使用したいと思う
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);
しかし、これは役に立たず、あなたが思うことをしていないかもしれません。 File
オブジェクトはファイルを保持せず、ファイルへのパスを保持します。 C:/hi.txt
。それがあなたのJSONに入れるものであれば、それは生成します
{"File" : "C:/hi.txt"}
ファイルの内容は含まれません。
したがって、ファイルパスを直接入力することもできます
JSONObject my_data = new JSONObject();
my_data.put("User", "Beth");
my_data.put("Date", "22-07-2013");
my_data.put("File", "C:/hi.txt");
JSONを使用してファイルをアップロードしようとしている場合、1つの方法はJava 7のNIOを使用してファイルからバイトを読み取ることです
byte[] bytes = Files.readAllBytes(file_upload .toPath());
Base64はこれらのバイトをエンコードし、JSONObjectに文字列として書き込みます。 Apache Commons Codecを使用する
Base64.encodeBase64(bytes);
my_data.put("File", new String(bytes));
マシンのアドレスをlocalhostから、下記のサービスを呼び出すためにクライアントが接続するIPアドレスに変更してください。
**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>