2

私は次のHTTPサーバーを作成しました。

import processing.net.*;
import java.io.FileInputStream;
import javax.activation.MimetypesFileTypeMap;


Client client = null;
Server server = null;
MimetypesFileTypeMap mimeMap = new MimetypesFileTypeMap();

void setup()
{
  server = new Server(this, 80);
  println(1);

  size(700, 700);

  fill(0);
  mimeMap.addMimeTypes("application/bmp bmp BMP Bmp");
}


void draw()
{
  background(255);

  while ( (client = server.available ()) == null) {
  }
  println(2);
  String req = "";
  String fileN;
  byte[] fileC;
  while (client.available () != 0) {
    req += client.readString();
    try { 
      Thread.sleep(100);
    } 
    catch (Throwable t) {
    }
  }

  println(req);
  fileN = URLDecoder.decode(req.split(" ")[1].substring(1));
  if (!fileN.equals("")) {
    try
    {
      FileInputStream fileS = new FileInputStream("C:\\" + fileN);
      fileC = new byte[fileS.available()];
      fileS.read(fileC);

      server.write(
       concatSB(
        "HTTP/1.0 200 OK\r\nContent-Type: " + 
        mimeMap.getContentType(fileN.substring( fileN.lastIndexOf("/") + 1 )) + 
        "\r\nContent-Length: " + 
        fileC.length + 
        "\r\n\r\n", 
        fileC
       )
      );

      println(3);
      println(fileN);
    }
    catch (Exception e)
    {
      server.write("HTTP/1.0 404 Not Found\r\n".getBytes());
      println(fileN + ": " + e.toString());
    }
  }
  exit();
}

void mouseClicked()
{
  server.stop();
  exit();
}

private byte[] concatSB(final String strng, final byte[] bytes) {     
  final StringBuilder sb = new StringBuilder(strng);
  for (byte b : bytes) {         
    sb.append((char)b);
  }
  println(strng);
  return sb.toString().getBytes();
} 

テキストには非常にうまく機能しますが、このBMPを送信したとき:

グラフィックス

このBMPを取り出しました。これは、Paintで自動的に開きます。

マングルグラフィックス

PaintでオリジナルをGIFに変換すると、サーバーから結果を読み取ることができず、IEでは悪い画像アイコン(赤いX)が表示されました。

どうすればこれを修正できますか?

4

1 に答える 1

2

バイナリであるfileCをStringBuilderに渡すのは良い考えではないと思います。私はむしろこのようなことをしたいです:

  server.write(
    "HTTP/1.0 200 OK\r\nContent-Type: " + 
    mimeMap.getContentType(fileN.substring( fileN.lastIndexOf("/") + 1 )) + 
    "\r\nContent-Length: " + 
    fileC.length + 
    "\r\n\r\n"
   );
  server.write(
    fileC
   );
于 2012-09-12T17:29:49.413 に答える