更新時間:2022-07-12 11:30:34 來源:動力節(jié)點 瀏覽2171次
在設計豐富多彩的網(wǎng)站或業(yè)務邏輯豐富的程序的過程中,必然會有很多圖片的相關操作,尤其是圖片的上傳。紙質辦公室可能需要備份和上傳紙質文件,網(wǎng)站建設可能需要上傳用戶頭像、圖片描述等,都需要將圖片從本地上傳到互聯(lián)網(wǎng)(服務器)。
當業(yè)務需要時,機器會隨著不斷制作的照片上傳到網(wǎng)站上,以便在網(wǎng)站上查看。
由于圖片的處理比較新,我們打算一點一點的解決這些業(yè)務需求。一、業(yè)務分為以下幾個部分:
1.服務器接收瀏覽器上傳的圖片。這很容易實現(xiàn),因為大部分服務器端開發(fā)都是基于B/S架構,即邏輯和瀏覽器端開發(fā)。
2.服務器接收客戶端上傳的圖片。這看起來可能不難,但是如何正確發(fā)送數(shù)據(jù)就有點難了,這也是今天筆者踩坑的地方。
3.業(yè)務邏輯的優(yōu)化和完善。
1.新建一個網(wǎng)頁
<! DOCTYPE html >
< html >
< head >
< meta charset ="UTF-8" >
< title >圖片上傳</ title >
</ head >
< body >
< formaction ="/plant / upload.action" enctype ="multipart/form-data"
方法="post" >
圖片:type ="file" name ="img" /> <br /> 11 < input type = "submit" value ="upload" /> 12 </ form > 13 </ body > 14 </ html >
2.對Controller層進行編碼
@Controller
public class UploadController {
@RequestMapping(value="/upload",method= RequestMethod.POST)
@ResponseBody
public String uploadImg(@RequestParam("img" ) MultipartFile img, HttpServletRequest request,HttpServletResponse response) {
字符串內(nèi)容類型 = img.getContentType(); //獲取文件類型
System.out.println("文件類型為:" + contentType);
字符串 originalFilename = img.getOriginalFilename(); //獲取文件原名
//判斷文件是否為空
if (! img.isEmpty()) {
File targetImg = new File("F:/img" );
//判斷文件夾是否存在
if (! targetImg.exists()) {
targetImg.mkdirs(); //級聯(lián)創(chuàng)建文件夾
}
try {
//開始保存圖片
FileOutputStream outputStream = newFileOutputStream("F:/img/" + originalFilename);
輸出流.write(img.getBytes());
輸出流.flush();
輸出流.close();
} catch (IOException e) {
e.printStackTrace();
}
}
返回“成功” ;
}
}
3.spring和依賴修改
<!-- 文件上傳組件 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}< /版本>
</依賴>
<!-- 支持文件上傳 -->
<bean id="multipartResolver" class ="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 請求編碼格式 -->
<屬性名="defaultEncoding" value="utf-8"></property>
<!-- 上傳文件大小(Company:byte) -->
<property name="maxUploadSize" value="50000000"></property>
<!-- 緩沖區(qū)大小(Company:KB) -->
<property name="maxInMemorySize" value="1024"></property>
</bean>
4.啟動項目,打開瀏覽器顯示對應圖片上傳網(wǎng)頁,選擇圖片,點擊上傳。如果不走出本地路徑,應該會看到剛剛上傳的圖片。
互聯(lián)網(wǎng)上有很多內(nèi)容。本部分介紹使用 HttpURLConnection 進行上傳。第一種方法相對復雜。您需要手動封裝請求并傳播數(shù)十行代碼。二是如果項目比較復雜,使用Session或者Cookie,沒辦法~
基于以上原因,本文選擇使用HttpClient上傳本地圖片
1.引入相關依賴
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId> org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.3</version>
</dependency>
2.編寫客戶端程序
導入java.io.BufferedReader;
導入java.io.File;
導入java.io.IOException;
導入java.io.InputStream;
導入java.io.InputStreamReader;
導入java.util.Arrays;
導入o??rg.apache.commons.codec.binary.Base64;
導入o??rg.apache.commons.lang3.StringUtils;
導入org.apache.http.HttpEntity;
導入o??rg.apache.http.client.ClientProtocolException;
進口org.apache.http.client.methods.CloseableHttpResponse;
導入org.apache.http.client.methods.HttpPost;
導入o??rg.apache.http.entity.ContentType;
導入o??rg.apache.http.entity.mime.MultipartEntityBuilder;
導入o??rg.apache.http.entity.mime.content.ByteArrayBody;
導入o??rg.apache.http.entity.mime.content.FileBody;
導入o??rg.apache.http.entity.mime.content.StringBody;
導入o??rg.apache.http.impl.client.CloseableHttpClient;
導入o??rg.apache.http.impl.client.HttpClients;
進口org.apache.http.util.EntityUtils;
public class ClientUpload {
public static void main(String[] args) throws ClientProtocolException, IOException, InterruptedException {
String url = "http://localhost:8090/plant/upload.action" ;
// 字符串 basePath = "F:\\img\\";
字符串路徑 = "G:\\123.jpg" ;
上傳圖片(網(wǎng)址,“dfsdfsdfsdf” ,路徑);
}
公共 靜態(tài)String uploadImage(String path, String base64String, String imageFilePath) throws ClientProtocolException, IOException {
// 1. 創(chuàng)建上傳需要的元素類型
// 1.1 本地上傳圖片加載文件
File imageFile = new File(imageFilePath);
文件體圖像文件體 =新文件體(圖像文件);
// 1.2 加載過程base64編碼的圖片數(shù)據(jù)
// String imageBase64Data = base64String;
// ByteArrayBody byteArrayBody = null;
// if (StringUtils.isNotEmpty(imageBase64Data)) {
// byte[] byteImage = Base64.decodeBase64(imageBase64Data);
// byteArrayBody = new ByteArrayBody(byteImage, "image_name");
// }
// 1.3 上傳對象的加載字符串
StringBody name = new StringBody("admin" , ContentType.TEXT_PLAIN);
// 2. 將要上傳的所有元素打包到 HttpEntity 對象中
// HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("name", name).addPart("img", imageFileBody).addPart("file2", byteArrayBody).build();
HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("name", name).addPart("img" , imageFileBody).build();
// 3. 建立HttpPost 對象,包含信息傳輸post news
HttpPost httpPost = new HttpPost(path);
httpPost.setEntity(reqEntity);
// 4. 建立 HttpClient 對象,傳入 httpPost 執(zhí)行發(fā)送網(wǎng)絡請求的動作
CloseableHttpClient httpClient =HttpClients.createDefault();
CloseableHttpResponse 響應 = httpClient.execute(httpPost);
// 5. 獲取返回的實體內(nèi)容對象并解析內(nèi)容
HttpEntity resultEntity = response.getEntity();
字符串響應消息 = "" ;
try {
if (resultEntity != null ) {
InputStream is = resultEntity.getContent();
BufferedReader br = new BufferedReader( new InputStreamReader(is));
字符串緩沖區(qū)某人 =新字符串緩沖區(qū)();
字符串行 = "" ;
while ((line = br.readLine()) != null ) {
sb.append(line);
}
響應消息 = sb.toString();
System.out.println("響應內(nèi)容為:" + responseMessage);
}
EntityUtils.consume(resultEntity);
}最后{
如果(空!=響應){
響應。關閉();
}
}
返回響應消息;
}
}
3.到目前為止,如果沒有意外的話,應該可以在控制臺看到令人興奮的“SUCCESS”輸出
1.由于圖片是不斷生成的,所以需要不斷的上傳圖片,保證上傳的圖片不重復。
public static void main(String[] args) throws ClientProtocolException, IOException, InterruptedException {
String url = "http://localhost:8090/plant/upload.action" ;
字符串 basePath = "F:\\img\\" ;
// 字符串路徑 = "G:\\123.jpg";
// uploadImage(url, "dfsdfsdfsdf",path);
while ( true ) {
File file = new File(basePath);
字符串[] 列表 =文件列表();
Arrays.sort(list);
for (String str : list) {
//圖片未標記為上傳
if (!str.startsWith("Upload" )) {
uploadImage(url, "chao", basePath + str); //上傳圖片
new File(basePath + str).renameTo( new File(basePath + "Upload_" + str)); //重命名圖片
}
}
Thread.sleep(1000*60); //等待 60 秒。
}
}
2.服務器的改進
如果想在開發(fā)的網(wǎng)站上能夠瀏覽圖片,一般業(yè)務比較小,可以直接發(fā)到Tomcat服務器,然后記錄路徑寫入數(shù)據(jù)庫;如果業(yè)務比較大,可以在本地設置圖片服務器,可以通過Nginx或者其他技術實現(xiàn),然后需要將路徑寫入數(shù)據(jù)庫保存。
以上就是關于“Java上傳圖片到服務器的方法”介紹,大家如果想了解更多相關知識,不妨來關注一下動力節(jié)點的Java在線學習,里面的課程內(nèi)容從入門到精通,很適合沒有基礎的小伙伴學習,希望對大家能夠有所幫助。