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

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM