gpt4 book ai didi

c# - 保存的 ZIP 文件损坏(从 Android 应用程序到 IIS 服务器)

转载 作者:行者123 更新时间:2023-12-01 04:52:57 24 4
gpt4 key购买 nike


trying to send an XML之后文件从我的客户端应用程序(在 Android 上)传输到服务器端(IIS 7)。我没有得到 XML 文件的文件名,只是得到了内容。
现在我意识到,简单地传输裸 XML 文件会太繁重(当我将几乎所有应用程序的数据同步到服务器之后)。

- 现在我正在寻求将压缩文件从我的客户端应用程序发送到服务器端。
- XML 文件被完美压缩,其大小减少到原始大小的一半以下。文件正在使用 FileEntity 直接使用 HTTP POST 方法发送,而使用 MultiPart 发送(这会是个问题吗) .

更新2:添加了我自己的答案(效果更好:D)。

更新:添加了客户端代码。

问题:
- zip 文件保存在服务器端,但当我打开它时,winrar/7zip 给了我一个错误,说 unexpected存档结束。

我提到了 nearly similar problem但我在 .NET 开发方面也处于劣势,在 C# 中也是如此:(因此无法真正利用确切的代码(缺少、未初始化的变量等)。 )。此外,这个帖子已经有 4 年历史了,我真的不希望有人会在那里做出回应。

我现有的服务器端代码:

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);
//...

如何解决这个问题? :(

最佳答案

我想说问题是由于代码中的 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 文件名,一种可能的方法是更改​​行

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

类似:

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

因此您可以使用 Request.Params 属性访问该参数。

警告:不要信任客户端发送的文件名(有人可以操纵它!)。对参数进行严格的清理/验证!

关于c# - 保存的 ZIP 文件损坏(从 Android 应用程序到 IIS 服务器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14642246/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com