Android 上传图片到 Asp.Net 服务器的问题
最近在做一个手机app联合系统管理做的应用程序,管理程序管理数据的发布和增删改查,手机app负责显示和操作业务逻辑这么一个功能。
刚开始路走的都很顺,但是走到通过Android客户端上传图片到Asp.Net 服务器的时候出现很大的问题,图片是上传了,就是显示不出来,用照片查看器查看的时候显示:‘没有预览’,用画图软件打开的时候显示‘无效的位图文件或不支持文件的格式!!!
大家想,肯定你的代码写得有问题,好吧,你们看看我的代码是什么问题吧:
Stream sr = context.Request.InputStream;
byte[] buffer = new byte[4096];
int bytesRead = 0;
//将当前数据流写入服务器端文件夹ClientBin下
const string savePath = "/RiskNoticeImg"; //目标图片路径
string dirPath = context.Server.MapPath(savePath);
string path = dirPath + @"\" + picName;
using (FileStream fs = File.Create(path, 4096))
{
while ((bytesRead = sr.Read(buffer, 0, buffer.Length)) > 0)
{
//向文件中写信息
fs.Write(buffer, 0, bytesRead);
}
}
看看,你们觉得有什么问题吗?我是看不出来,搞了两天,人都快崩溃了,然后漫无目的的在网上找答案,有的说要Base64编码才行,但是还是不行,也不是说不行,是我没有试,最恶心的是这篇帖子:点击这里查看,为什么这么说呢,因为明明跟我是一样的问题,明明他也解决了,但是就是不告诉你怎么解决的,无奈之下求助项目经理,经过他电脑般的大脑高速运转就解决问题了,接下来就是见证奇迹的时刻:
context.Request.Files[0].SaveAs(path);
是的,就这一行代码就搞定了,这段代码区别于(我也不知道这两行代码有什么区别,如果有牛人知道的话,希望给我留言小弟感激不尽!):
context.Request.InputStream;
如果你测试这行代码搞不定,那你可以根据它的Files.Count来循环输出它的文件像这样:context.Request.Files[i].SaveAs(filePath);这样就解决上传图片显示不了的问题了,希望对有些人有所帮助吧^_^,
最后想讲下,他是通过这个文件得到的灵感:
package main;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class hello extends HttpServlet{
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
try
{
request.setCharacterEncoding("UTF-8"); // 设置处理请求参数的编码格式
response.setContentType("text/html;charset=UTF-8"); // 设置Content-Type字段值
PrintWriter out = response.getWriter();
// 下面的代码开始使用Commons-UploadFile组件处理上传的文件数据
FileItemFactory factory = new DiskFileItemFactory(); // 建立FileItemFactory对象
ServletFileUpload upload = new ServletFileUpload(factory);
// 分析请求,并得到上传文件的FileItem对象
List<FileItem> items = upload.parseRequest(request);
// 从web.xml文件中的参数中得到上传文件的路径
String uploadPath = "d:\\upload\\";
File file = new File(uploadPath);
if (!file.exists())
{
file.mkdir();
}
String filename = ""; // 上传文件保存到服务器的文件名
InputStream is = null; // 当前上传文件的InputStream对象
// 循环处理上传文件
for (FileItem item : items)
{
// 处理普通的表单域
if (item.isFormField())
{
if (item.getFieldName().equals("filename"))
{
// 如果新文件不为空,将其保存在filename中
if (!item.getString().equals(""))
filename = item.getString("UTF-8");
}
}
// 处理上传文件
else if (item.getName() != null && !item.getName().equals(""))
{
// 从客户端发送过来的上传文件路径中截取文件名
filename = item.getName().substring(
item.getName().lastIndexOf("\\") + 1);
is = item.getInputStream(); // 得到上传文件的InputStream对象
}
}
// 将路径和上传文件名组合成完整的服务端路径
filename = uploadPath + filename;
// 如果服务器已经存在和上传文件同名的文件,则输出提示信息
if (new File(filename).exists())
{
new File(filename).delete();
}
// 开始上传文件
if (!filename.equals(""))
{
// 用FileOutputStream打开服务端的上传文件
FileOutputStream fos = new FileOutputStream(filename);
byte[] buffer = new byte[8192]; // 每次读8K字节
int count = 0;
// 开始读取上传文件的字节,并将其输出到服务端的上传文件输出流中
while ((count = is.read(buffer)) > 0)
{
fos.write(buffer, 0, count); // 向服务端文件写入字节流
}
fos.close(); // 关闭FileOutputStream对象
is.close(); // InputStream对象
System.out.println("文件上传成功!!!");
out.println("文件上传成功!");
}
}
catch (Exception e)
{
System.out.println("出现异常");
e.printStackTrace();
}
}
}
Android 上传图片到 Asp.Net 服务器的问题的更多相关文章
- android上传文件到服务器
package com.spring.sky.image.upload.network; import java.io.DataOutputStream; import java.io.File; i ...
- android -上传文件到服务器
android上传文件到服务器 重点:最好是设置好content-type这些参数的配置! package com.spring.sky.image.upload.network; ...
- Android操作HTTP实现与服务器通信(转)
Android操作HTTP实现与服务器通信 本示例以Servlet为例,演示Android与Servlet的通信. 众所周知,Android与服务器通信通常采用HTTP通信方式和Socket通信方 ...
- Android提交数据到JavaWeb服务器实现登录
之前学习Android提交数据到php服务器没有成功,在看了两三个星期的视频之后,现在终于实现了与服务器的交互.虽然完成的不是PHP端的,但是在这个过程还是学到了不少东西的.现在我先来展示一下我的成果 ...
- 『Asp.Net 组件』Asp.Net 服务器组件 内嵌JS:让自己的控件动起来
代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...
- android文件上传到服务器
package uploadDemo; import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStre ...
- 【经验记录】Android上传文件到服务器
Android中实现上传文件,其实是很简单的,和在java里面是一样的,基本上都是熟悉操作输出流和输入流!还有一个特别重要的就是需要配置content-type的一些参数!如果这些都弄好了,上传就很简 ...
- 『Asp.Net 组件』Asp.Net 服务器组件 内嵌CSS:将CSS封装到程序集中
代码: <span style="font-family:Microsoft YaHei; font-size:12px">using System; using Sy ...
- Android客户端调用Asp.net的WebService
Android客户端调用Asp.net的WebService 我来说两句 |2011-11-23 13:39:15 在Android端为了与服务器端进行通信有几种方法:1.Socket通信2.WCF通 ...
随机推荐
- HTML框架标签
与HTML框架有关的标签主要有三种: <frameset>框架结构标签 <frame>框架标签 <iframe>内联框架标签 一. 先来说第一种框架结构标签 < ...
- Java Base64 加密解密
使用JDK的类 BASE64Decoder BASE64Encoder package test; import sun.misc.BASE64Decoder; import sun.misc.BA ...
- linux查找日志常用命令
1.查找文件test中目标字符串(xxxx)出现的行数位置grep -n xxxx test 2.文件test从某一行(n)开始显示more +n test 3.查询文件test中出现目标字符串x ...
- Sublime Text 使用 Emmet 补全错误问题
Sublime Text安装了Emmet后,使用Tab或者ctrl+e发现补全有问题,如: div.testClass#testId 变成了 div.<testClass id="te ...
- 为什么swing不适合做桌面软件
http://www.zhihu.com/question/19608871 我最近几年做的项目清一色的都是HTML5了,这篇<基于HTML5的电信网管3D机房监控应用>供参考,HTML5 ...
- CentOS编译安装lamp
LAMP环境搭建(编译安装CentOS+httpd2.2+mysql5.5+php5.4) 首先准备以下压缩包 <ignore_js_op> (1)编译安装apache 1.配置防火墙,开 ...
- C#winform在textbox插入内容换行
要让一个TextBox显示多行文本就得把它的Multiline属性设置为true,可是如果你是要把TextBox的Text属性设置多行文本时可能会遇到点麻烦,也许你会想到直接加一个换行符"\ ...
- 解决DataGridView在多线程中无法显示滚动条的问题
在多线程中对DataGridView指定 DataSource 来填充数据,更新数据的时候,会导致DataGridView出现假死,显示错误或者滚动条无法显示的问题,在保证了DataGridView的 ...
- 3种方式实现Java多线程
java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 public class thread1 extends Thread ...
- WordPress 撰写文章页面显示所有标签
WordPress 撰写文章时,点击"从常用标签中选择"只显示45个常用的标签,很多情况下还需手工再次输入标签,这样的限制感觉很不方便,通过下面的方法可以解除这个限制,显示全部标签 ...