首頁 web前端 H5教程 用html5 ajax Java介面實作上傳圖片實例碼

用html5 ajax Java介面實作上傳圖片實例碼

May 11, 2018 pm 02:40 PM

html5圖片上傳【檔案上傳】,在網路上找了很多資料,主要也就2種

1.from表單提交的方式

<form action="pushUserIcon" method="post" enctype="multipart/form-data"> 
    <table> 
        <tr> 
            <td width="50" align=left>图片:</td> 
            <td><input type="file" name="file"/></td>            
        </tr> 
        <tr> 
            <td width="50" align="left">用户id:</td> 
            <td><input type="text" name="userId"/></td>            
        </tr>
        <tr>
            <td><input type="submit"> </td>
        </tr>
    </table> 
</form>
登入後複製

注意:  enctype= "multipart/form-data" 必須填入

1.1.Java頁面直接提交:

  @RequestMapping(value="/pushUserIcon",method=RequestMethod.POST)
@ResponseBody
public String pushUserIcon(HttpServletRequest request, HttpServletResponse response) throws IOException,BaseException { 
 
    String result = null;
    String userId = request.getParameter("userId");
    try{
        //转型为MultipartHttpRequest(重点的所在) 
        MultipartHttpServletRequest multipartRequest  =  (MultipartHttpServletRequest) request; 
        //获得第1张图片(根据前台的name名称得到上传的文件)  
        MultipartFile file  =  multipartRequest.getFile("file");
        result = uploadImageServic.uploadFile(file, request, userId); 
         
        System.out.println("result:" + result); 
        response.setContentType("text/html;charset=utf8"); 
        response.getWriter().write("result:" + result);    
      }catch(Exception e){
        BaseException baseException = new BaseException(e);
        baseException.setErrorMsg("Upload API Exception");
        throw baseException;
    }      
    return  null; 
}
登入後複製


1.2.原生js 和jQuery的網路上有很多,這裡就不多說了。
1.2.1. fromData建立的兩種方式

##

var formData = new FormData($("#myForm")[0]);//用form 表单直接 构造formData 对象; 就不需要下面的append 方法来为表单进行赋值了。 
               
       //var formData = new FormData();//构造空对象,下面用append 方法赋值。 
//       formData.append("policy", ""); 
//       formData.append("signature", ""); 
//       formData.append("file", $("#file_upload")[0].files[0]);
登入後複製

2.不用from表單提交:

<table style="border: 1px solid black; width: 100%">
     <tr>
            <td width="50" align=left>图片:</td> 
            <td><input type="file"  id="imageFile" name="img" multiple="multiple"/></td>
            <td>
                <input type="button" value="调用" onclick="pushImg()" />
            </td>
        </tr>       
</table>
登入後複製

HTML就這些,我想大家應該都看得懂,下面就要說說這2種提交方式,Ajax是如何編碼? 【from表單提交方式也可以使用js或直接提交頁面重新整理】

Ajax編碼也有2種:

1.原生js

function sub()
{
    var file = document.getElementById("imageFile");
    var files = file.files;
    for(var i = 0 ; i < files.length;i++)
    {
        uploadFile(files[i]);
    }
}
 
var xhr = null;
function uploadFile(file) {
    xhr = new XMLHttpRequest();
   /*  xhr.addEventListener("error", uploadFailed, false);
    xhr.addEventListener("abort", uploadCanceled, false); */
    xhr.open("post", "upload/", true); //访问控制器是upload,后面必须加&#39;/&#39;否则会报错"org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.Mult...",但是如果是多级的URL【例如XX/XXX/00/upload/0】又没问题了.
    var fd = new FormData();
    fd.append("userID", "1");
    fd.append("errDeviceType", "001");
    fd.append("errDeviceID", "11761b4a-57bf-11e5-aee9-005056ad65af");
    fd.append("errType", "001");
    fd.append("errContent", "XXXXXX");
    fd.append("errPic", file);
    xhr.send(fd);
    xhr.onreadystatechange = cb;
}
function cb()
{
    if(xhr.status == 200)
    {
        var b = xhr.responseText;
        if(b == "success"){
            alert("上传成功!");
        }else{
            alert("上传失败!");
        }
    }
}
登入後複製


2.jquery

function pushImg(obj) {
    debugger;
    var url = "upload/"; //访问控制器是upload,后面必须加&#39;/&#39;否则会报错"org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.Mult...",但是如果是多级的URL【例如XX/XXX/00/upload/0】又没问题了.
    var param = $("#errorParameter").val();
 
    var files = $("#imageFile").get(0).files[0]; //获取file控件中的内容
 
    var fd = new FormData();
    fd.append("userID", "1");
    fd.append("errDeviceType", "001");
    fd.append("errDeviceID", "11761b4a-57bf-11e5-aee9-005056ad65af");
    fd.append("errType", "001");
    fd.append("errContent", "XXXXXX");
    fd.append("errPic", files);
    $.ajax({
        type: "POST",
        contentType:false, //必须false才会避开jQuery对 formdata 的默认处理 , XMLHttpRequest会对 formdata 进行正确的处理
        processData: false, //必须false才会自动加上正确的Content-Type 
        url: url,
        data: fd,
        success: function (msg) {
            debugger;
            var jsonString = JSON.stringify(msg);
            $("#txtTd").text(jsonString)
            alert(jsonString);
        },
        error: function (msg) {
            debugger;
            alert("error");
        }
    });
}
登入後複製

現在前端的就應該​​差不多了,現在就是介面了,我的參數和存取路徑都好了,現在就差介面服務了:
spring mvc框架:

@RequestMapping(value = { "upload" })
        public void pushErrorData(HttpServletRequest request,
                    HttpServletResponse response) throws BaseException {
            String userID=request.getParameter("userID");
                 
                 
            // 转型为MultipartHttpRequest(重点的所在)这个就是上面ajax中提到如果直接访问此接口而不加"/",此转型就会报错
            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
                 
            //MultipartFile file = multipartRequest.getFiles("errPic");//获取文件集合  对应  jquery $("#imageFile").get(0).files
            // 获得第1张图片(根据前台的name名称得到上传的文件)
            MultipartFile file = multipartRequest.getFile("errPic"); //对应  jquery $("#imageFile").get(0).files[index]
            Map<String, Object> map = new HashMap<String, Object>();
            if (null!=file && !file.isEmpty()) {
                try {
                    map = Common.uploadFile(file);
                         
                } catch (IOException e) {
                    BaseException baseException = new BaseException(e);
                    //baseException.setErrorMsg(imgErrorMsg);
                    throw baseException;
                }
            }
        }
 
/**
     * 图片上传
     *
     * @param file
     * @return
     * @throws IOException
     * @throws BaseException
     */
    public static Map<String, Object> uploadFile(MultipartFile file)
            throws IOException, BaseException {
        String fail = ConfigBundleHelper.getValue("busConfig", "fail");//上传失败状态
        String success = ConfigBundleHelper.getValue("busConfig", "success");//上传成功状态
        String errorMsg = ConfigBundleHelper.getValue("busConfig","imgErrorMsg");//上传错误信息
        String filePath = ConfigBundleHelper.getValue("busConfig", "filePath");//上传路径,本来是相对路径,但是在发布后路径会创建在tomcat的bin目录下,所以接口上传的路径是一个难题,我用的是绝对路径,等到发布到Linux环境中,通过配置文件修改路径为Linux中的资源地址【防止工程删除而资源文件不会丢失】,然后重新发布工程时再通过Linux的命令把我们需要的资源文件导入到我们发布的工程项目中。
        String size = ConfigBundleHelper.getValue("busConfig", "fileSize");
        String interfaceService = ConfigBundleHelper.getValue("busConfig",
                "interfaceService");
         
        long maxFileSize = (Integer.valueOf(size)) * 1024 * 1024;
        String suffix = file.getOriginalFilename().substring(
                file.getOriginalFilename().lastIndexOf("."));
        long fileSize = file.getSize();
        Map<String, Object> map = new HashMap<String, Object>();
        if (suffix.equals(".png") || suffix.equals(".jpg")) {
            if (fileSize < maxFileSize) {
                // System.out.println("fileSize"+fileSize);
                String fileName = file.getOriginalFilename();
                fileName = new String(fileName.getBytes("ISO-8859-1"), "UTF-8");
                File tempFile = new File(filePath, new Date().getTime()
                        + fileName);
 
                try {
                    if (!tempFile.getParentFile().exists()) {
                        tempFile.getParentFile().mkdirs();//如果是多级文件使用mkdirs();如果就一层级的话,可以使用mkdir()
                    }
                    if (!tempFile.exists()) { 
                        tempFile.createNewFile();
                    }
                    file.transferTo(tempFile);
                } catch (IllegalStateException e) {
                    BaseException baseException = new BaseException(e);
                    baseException.setErrorMsg(errorMsg);
                    throw baseException;
                }
 
                map.put("SUCESS", success);
                map.put("data",interfaceService + filePath + new Date().getTime() + tempFile.getName());
 
            } else {
                map.put("SUCESS", fail);
                map.put("data", "Image too big");
            }
 
        } else {
            map.put("SUCESS", fail);
            map.put("data", "Image format error");
        }
        return map;
    }
登入後複製

这是我在工作中所遇到到问题,分享给大家,希望大家不会在这个问题上花费大量的时间。谢谢

以上是用html5 ajax Java介面實作上傳圖片實例碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1677
14
CakePHP 教程
1431
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
作曲家:通過AI的幫助開發PHP 作曲家:通過AI的幫助開發PHP Apr 29, 2025 am 12:27 AM

AI可以幫助優化Composer的使用,具體方法包括:1.依賴管理優化:AI分析依賴關係,建議最佳版本組合,減少衝突。 2.自動化代碼生成:AI生成符合最佳實踐的composer.json文件。 3.代碼質量提升:AI檢測潛在問題,提供優化建議,提高代碼質量。這些方法通過機器學習和自然語言處理技術實現,幫助開發者提高效率和代碼質量。

H5:HTML5的關鍵改進 H5:HTML5的關鍵改進 Apr 28, 2025 am 12:26 AM

HTML5帶來了五個關鍵改進:1.語義化標籤提升了代碼清晰度和SEO效果;2.多媒體支持簡化了視頻和音頻嵌入;3.表單增強簡化了驗證;4.離線與本地存儲提高了用戶體驗;5.畫布與圖形功能增強了網頁的可視化效果。

如何使用MySQL的函數進行數據處理和計算 如何使用MySQL的函數進行數據處理和計算 Apr 29, 2025 pm 04:21 PM

MySQL函數可用於數據處理和計算。 1.基本用法包括字符串處理、日期計算和數學運算。 2.高級用法涉及結合多個函數實現複雜操作。 3.性能優化需避免在WHERE子句中使用函數,並使用GROUPBY和臨時表。

HTML5:標準及其對Web開發的影響 HTML5:標準及其對Web開發的影響 Apr 27, 2025 am 12:12 AM

HTML5的核心特性包括語義化標籤、多媒體支持、離線存儲與本地存儲、表單增強。 1.語義化標籤如、等,提升代碼可讀性和SEO效果。 2.和標籤簡化多媒體嵌入。 3.離線存儲和本地存儲如ApplicationCache和LocalStorage,支持無網絡運行和數據存儲。 4.表單增強引入新輸入類型和驗證屬性,簡化處理和驗證。

討論可能需要在Java中編寫平台特定代碼的情況。 討論可能需要在Java中編寫平台特定代碼的情況。 Apr 25, 2025 am 12:22 AM

在Java中編寫平台特定代碼的原因包括訪問特定操作系統功能、與特定硬件交互和優化性能。 1)使用JNA或JNI訪問Windows註冊表;2)通過JNI與Linux特定硬件驅動程序交互;3)通過JNI使用Metal優化macOS上的遊戲性能。儘管如此,編寫平台特定代碼會影響代碼的可移植性、增加複雜性、可能帶來性能開銷和安全風險。

怎樣在C  中使用type traits? 怎樣在C 中使用type traits? Apr 28, 2025 pm 08:18 PM

typetraits在C 中用於編譯時類型檢查和操作,提升代碼的靈活性和類型安全性。 1)通過std::is_integral和std::is_floating_point等進行類型判斷,實現高效的類型檢查和輸出。 2)使用std::is_trivially_copyable優化vector拷貝,根據類型選擇不同的拷貝策略。 3)注意編譯時決策、類型安全、性能優化和代碼複雜性,合理使用typetraits可以大大提升代碼質量。

MySQL的字符集和排序規則如何配置 MySQL的字符集和排序規則如何配置 Apr 29, 2025 pm 04:06 PM

在MySQL中配置字符集和排序規則的方法包括:1.設置服務器級別的字符集和排序規則:SETNAMES'utf8';SETCHARACTERSETutf8;SETCOLLATION_CONNECTION='utf8_general_ci';2.創建使用特定字符集和排序規則的數據庫:CREATEDATABASEexample_dbCHARACTERSETutf8COLLATEutf8_general_ci;3.創建表時指定字符集和排序規則:CREATETABLEexample_table(idINT

如何在MySQL中重命名數據庫 如何在MySQL中重命名數據庫 Apr 29, 2025 pm 04:00 PM

MySQL中重命名數據庫需要通過間接方法實現。步驟如下:1.創建新數據庫;2.使用mysqldump導出舊數據庫;3.將數據導入新數據庫;4.刪除舊數據庫。

See all articles