zoukankan      html  css  js  c++  java
  • Android 上传图片到 Asp.Net 服务器的问题

    最近在做一个手机app联合系统管理做的应用程序,管理程序管理数据的发布和增删改查,手机app负责显示和操作业务逻辑这么一个功能。

    刚开始路走的都很顺,但是走到通过Android客户端上传图片到Asp.Net 服务器的时候出现很大的问题,图片是上传了,就是显示不出来,用照片查看器查看的时候显示:‘没有预览’,用画图软件打开的时候显示‘无效的位图文件或不支持文件的格式!!!

    QQ截图20141110170853

    QQ截图20141110170910 

    大家想,肯定你的代码写得有问题,好吧,你们看看我的代码是什么问题吧:

    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();
            }
        }

    }

  • 相关阅读:
    Excel操作基本方法 服务器端不用安装Office工具
    使用IrisSkin2给软件"换肤"
    手机进行GPRS连接的代码(C#.NET开发)
    C# DataGridView 倒出word
    win2003优化大全 (转载)
    c# Invoke和BeginInvoke 区别
    关于sqlite3使用top的一些规则总结
    C#拷贝文件和复制文件夹实例代码 C#拷贝文件
    c# FileSystemWatcherc# FileSystemWatcher控件的使用方法控件的使用方法
    所见即所得富文本编辑器实现原理 转
  • 原文地址:https://www.cnblogs.com/zhangwei595806165/p/4087692.html
Copyright © 2011-2022 走看看