0

私はブラウザで動作する必要がある単純なサーバーで作業しています。私がそれにいくつかのコマンドを与えるとき、それは私の答えに答えるためにいくつかのhtmlコードで私に答えなければなりません。たとえば、フォルダなどのファイルのリストを表示できます。localhost:port / somecommandを使用してサーバーにアクセスできます。現在、ローカルハードディスクからファイルをダウンロードする作業を行っています。私がやりたいのは、localhost:port / download / filepathのようなURLを入力し、ブラウザーにそれをダウンロードさせることです。返信を作成するとき、ダウンロードするファイルがあることをhtmlが理解するために必要なすべてのものを入力します。実際、ファイルをダウンロードするように求める従来のポップアップウィンドウがありますが、受け取ったものは元のファイルよりも大きくなります。ハードディスクに、そして実際にはファイルが破損しています。ここにコードがあります:

これは私が送り返すhtmlです

HTTP/1.0 200 OK
Date: Tue Apr 10 16:23:55 2012
Content-Type: application/octet-stream
Content-Disposition: attachment; filename=mypic.jpg
Content-Length: 2574359
                       //empty line here

(私はContent-Dispositionヘッダーフィールドのテキストに従いました)

次に、ファイルから読み取り、最初にhtmlを送り返し、次にファイルから読み取ったものを送り返します。

int file=open(name,O_RDONLY);
void * data=malloc(buf.st_size+1); //buf.st_size is the correct file size
size_t readed=read(file,data,buf.st_size);
send(sd_current, html, DIRSIZE, 0); //html is a string containing what you I showed you 
send(sd_current, data, readed);

この結果、localhost:port / download / filepathを使用してダウンロードできるファイルが元のファイルよりも大きくなり、破損しましたが、その理由を取り除くことはできません。誰かが私を助けることができますか?

4

2 に答える 2

0

確認事項:

  1. DIRSIZE は本当に http ヘッダーのサイズですか? (サイズは変化する必要があり、大文字は通常定数を意味するため)。
  2. 読み取りは成功していますか?
  3. ファイルはどのように破損していますか?
  4. http ヘッダーの行末は正しいですか? \r\n

編集:

DIRSIZE がヘッダーのサイズでない場合、残りのバッファー (NULL またはジャンクを含む) は他のサイズに送信されます。

したがって、反対側は HTTP ヘッダーを確認し、データの受信を開始します - 残りのhtmlバッファから始めて、次にファイルの内容です。

次に、受信者に応じて、Content-Lengthヘッダー サイズで停止するか、ストリームがまだデータを配信している間続行します。

それはあなたの結果の内容と一致していますか?

于 2012-04-10T14:50:46.880 に答える
0

Content-Length: 2574359, 2574359 は jpg ファイルのサイズである必要がありますが、それを html 部分に入れるためのコードは何も表示されません。buf.st_size == 2574359 ?

于 2012-04-10T17:27:31.470 に答える