2

Java コードから Web サイトに Base64 でエンコードされた画像を POST しようとしています。ファイルのエンコードとデコードをローカルでテストしたところ、うまく機能しました。しかし、ウェブサイトにアクセスすると、画像が空白であると言われます。

これが私がPOSTする方法です。アップロードの代わりに別のアクションを使用すると、正しい応答が得られます!

ready = new java.net.URL(url);
        WebRequest request = new WebRequest(ready, HttpMethod.POST);
        request.setAdditionalHeader("Content-Type", "application/x-www-form-urlencoded");

        String requestBody = "action=upload"
                +"&key=ABCDEFG123456"
                + "&file=" + encodedFile
                + "&gen_task_id=" + SQL.getNextID();

encodedFile は、次のコードから取得されます。

    File file = new File("temp.jpg");

    FileInputStream fin = new FileInputStream(file);

    byte fileContent[] = new byte[(int)file.length()];
    fin.read(fileContent);

    //all chars in encoded are guaranteed to be 7-bit ASCII
    byte[] encoded = Base64.encodeBase64(fileContent);
    String encodedFile = new String(encoded);

真剣に、私は何を間違っていますか?? もう何時間も頭を壁にぶつけています!

4

2 に答える 2

3

私はついにそれを理解しました。これが、この問題を抱えている他の人のために私がしたことです。

BufferedImage img = ImageIO.read(new File("temp.jpg"));             
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "jpg", baos);
baos.flush();
Base64 base = new Base64(false);
String encodedImage = base.encodeToString(baos.toByteArray());
baos.close();
encodedImage = java.net.URLEncoder.encode(encodedImage, "ISO-8859-1");
request.setRequestBody(encodedImage);
于 2012-06-20T13:29:22.183 に答える
1

FileInputStream.read(byte[] b)bデータが使用可能であっても、バイト配列バッファーが完全に満たされることは保証されません。次のコードは、バッファが完全にいっぱいであることを保証します。

File file = new File("temp.jpg");

FileInputStream fin = new FileInputStream(file);

byte fileContent[] = new byte[(int)file.length()];
int offset = 0;

while ( offset < fileContent.length ) {
    int count = fin.read(fileContent, offset, fileContent.length - offset);
    offset += count;
}

//all chars in encoded are guaranteed to be 7-bit ASCII
byte[] encoded = Base64.encodeBase64(fileContent);
String encodedFile = new String(encoded);

または、次のように使用できますByteArrayOutputStream

File file = new File("temp.jpg");

FileInputStream fin = new FileInputStream(file);
ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte [] buffer = new byte[1024];
int count = 0;

while ( (count = fin.read(buffer)) != -1 ) {
    baos.write(buffer, 0, count);
}

byte [] fileContent = baos.toByteArray();

//all chars in encoded are guaranteed to be 7-bit ASCII
byte[] encoded = Base64.encodeBase64(fileContent);
String encodedFile = new String(encoded);

または、次のようFileInputStreamにオブジェクトをオブジェクトでラップすることもできます。DataInputStream

File file = new File("temp.jpg");

FileInputStream fin = new FileInputStream(file);
DataInputStream dis = new DataInputStream(fin);

byte fileContent[] = new byte[(int)file.length()];
dis.readFully(fileContent);

//all chars in encoded are guaranteed to be 7-bit ASCII
byte[] encoded = Base64.encodeBase64(fileContent);
String encodedFile = new String(encoded);

これを実現する方法は他にもあると確信しています。

于 2013-03-06T18:10:22.460 に答える