1


クライアント側アプリ (Android) からサーバー側 (IIS 7) にXML ファイルを送信しようとした後。XML ファイルのファイル名は取得できませんでしたが、内容だけは問題ありませんでした。
ここで、生の XML ファイルを転送するだけでは負荷がかかりすぎることに気付きました (ほぼすべてのアプリ データをサーバーに同期させた後)。

- 現在、クライアント アプリからサーバー側に圧縮ファイルを送信しようとしています。
- XML ファイルは完全に圧縮され、元のサイズの半分以下にサイズが縮小されます。ファイルは、HTTP POST直接使用する方法と使用FileEntityないMultiPart方法を使用して送信されています(問題になる可能性があります)。

更新 2:自分の回答を追加しました (うまくいきます:D)。

アップデート:クライアント側のコードを追加。

問題:
- zip ファイルはサーバー側に保存されますが、それを開くと、winrar/7zip で というエラーが表示されましたunexpected end of archive.私はほぼ同様

の問題に言及しましたが、私は開発に関しても下手です:(したがって、正確なコードを実際に利用することはできませんでした(欠落、初期化されていない変数など)。また、スレッドは4年ほどです古くて、誰かがそこに反応することを本当に望んでいません。.NETC#

私の既存のサーバー側コード:

string fileName = "D:\\newZIPfile.zip";
        Stream myStream = Request.InputStream;
        byte[] message = new byte[myStream.Length];
        myStream.Read(message, 0, (int)myStream.Length);
        string data = System.Text.Encoding.UTF8.GetString(message);

        using (FileStream fs = new FileStream(fileName, FileMode.Create))
        {
            using (StreamWriter writer = new StreamWriter(fs, System.Text.Encoding.UTF8))
            {
                writer.Write(data);
            }
        }

私のクライアント側のコード:

 File file2send = new File(newzipfile);

                String urlString = "http://192.168.1.189/prodataupload/Default.aspx";       // FOR TEST
                HttpParams httpParams = new BasicHttpParams();
                int some_reasonable_timeout = (int) (30 * DateUtils.SECOND_IN_MILLIS);

                HttpConnectionParams.setConnectionTimeout(httpParams, some_reasonable_timeout);

                HttpClient client = new DefaultHttpClient(httpParams);
                HttpPost post = new HttpPost(urlString);

                //System.out.println("SYNC'ing USING METHOD: " + post.getMethod().toString());
             try {
                   //OLD FILE-ENTITY MECHANISM >
                    FileEntity fEntity = new FileEntity(file2send, "application/zip");

                    //NEW (v1.5) INPUTSTREAM-ENTITY MECHANISM >
                    //InputStreamEntity fEntity = new InputStreamEntity(new FileInputStream(newzipfile), -1);
                   // fEntity.setContentType("application/zip");
                    post.setEntity(fEntity);

                    HttpResponse response = client.execute(post);
                    resEntity = response.getEntity();
                    res_code = response.getStatusLine().getStatusCode();            
                    final String response_str = EntityUtils.toString(resEntity);
                    if (resEntity != null) {        
                        Log.i("RESPONSE",response_str);
            //...

この問題を解決するにはどうすればよいですか? :(

4

2 に答える 2

0

したがって、この問題は、私がこれまでに経験した多くのフォーラム/スレッドで多くの人々を悩ませてきました.

私がやったことは次のとおりです。
- クライアント側を変更して、binary/octet-streamコンテンツ タイプを設定します。

- サーバー側のコードを次のように変更します: UPDATED:

if(Request.InputStream.Length < 32768) {
        Request.ContentType = "binary/octet-stream";
        Stream myStream = Request.InputStream;
        string fName = Request.Params["CLIENTFILENAME"];
        //string fName = Request.Params.GetValues("zipFileName");

        int iContentLengthCounter = 0;
        int maxlength = (int) myStream.Length;
        byte[] bFileWriteData = new byte[maxlength];
        string fileName = "D:\\"+ fName +".zip";

        //FileStream oFileStream = new FileStream();

        while (iContentLengthCounter < maxlength)
       {
           iContentLengthCounter += Request.InputStream.Read(bFileWriteData, iContentLengthCounter, (maxlength - iContentLengthCounter));
       }
        System.IO.FileStream oFileStream = new System.IO.FileStream(fileName, System.IO.FileMode.Create, System.IO.FileAccess.Write);
       oFileStream.Write(bFileWriteData, 0, bFileWriteData.Length);

        oFileStream.Close();
       Request.InputStream.Close();
    }
    else
    {
    }

基本的に..私はデータaccを拾っていません。その長さに。(回答には編集が必要です..後で行う必要があります)

于 2013-02-01T11:14:17.267 に答える
0

この問題は、コード内の ZIP ファイル (バイナリ) を UTF-8 ストリームに変換したことが原因であると言えます。

サーバー側のコードを次のように置き換えてみてください。

string fileName = "D:\\newZIPfile.zip";

using (FileStream fs = new FileStream(fileName, FileMode.Create))
{
    byte[] buffer = new byte[32768];
    int read;
    while ((read = Request.InputStream.Read(buffer, 0, buffer.Length)) > 0)
    {
        fs.Write (buffer, 0, read);
    }
}

これにより、受信した入力ストリームが ZIP ファイルに書き込まれます。

クライアントの ZIP ファイル名も受け取るには、行を変更するのが 1 つの方法です。

String urlString = "http://192.168.1.189/prodataupload/Default.aspx";

次のようなものに:

String urlString = "http://192.168.1.189/prodataupload/Default.aspx?CLIENTFILENAME=" + 
    urlEncodedFilename;

したがって、プロパティを使用してパラメーターにアクセスできますRequest.Params

警告: クライアントから送信されたファイル名を信頼しないでください (誰かがファイルを操作する可能性があります!)。パラメータに対して厳密なサニテーション/検証を行ってください!

于 2013-02-01T11:14:22.433 に答える