标签: 上传文件

在前端页面上传文件到服务器方法示例

在前端页面上传文件到服务器方法示例
1.选择图片
<div class=”item1 update_pic” >
<span>摘要图片:</span>
<img src=”${pageContext.request.contextPath}/upload/<s:property value=”article_pic” />” id=”imageview” class=”item1_img” >
<label for=”fileupload” id=”label_file”>上传文件</label>
<input type=”file” name=”upload” id=”fileupload”/>
</div>
/*原理是把本地图片路径:”D(盘符):/image/…”转为”http://…”格式路径来进行显示图片*/
$(“#fileupload”).change(function() {
var $file = $(this);
var objUrl = $file[0].files[0];
//获得一个http格式的url路径:mozilla(firefox)||webkit or chrome
var windowURL = window.URL || window.webkitURL;
//createObjectURL创建一个指向该参数对象(图片)的URL
var dataURL;
dataURL = windowURL.createObjectURL(objUrl);
$(“#imageview”).attr(“src”,dataURL);
console.log($(‘#imageview’).attr(‘style’));
if($(‘#imageview’).attr(‘style’) === ‘display: none;’){
$(‘#imageview’).attr(‘style’,’inline’);
$(‘#imageview’).width(“300px”);
$(‘#imageview’).height(“200px”);
$(‘.update_pic’).attr(‘style’, ‘margin-bottom: 80px;’);
}
});
2.上传图片
1).form表单enctype设置为multipart/form-data.

<!–在from中添加的属性enctype=”multipart/form-data”–>
<form id=”blog_form” action=”${ctx}/article_update.action” method=post enctype=”multipart/form-data”>
<div class=”edit_content”>
<div class=”item1″>
<div>
<span>文章标题:</span>
<input type=”text” class=”am-form-field” name=”article_title” style=”width: 300px”
value=”<s:property value=”article_title” />”
>&nbsp;&nbsp;
</div>
</div>

<input type=”text” name=”article_desc” id=”article_desc” style=”display: none;”>

<div class=”item1″>
<span>所属分类:</span>
<select id=”category_select” name=”category.parentid” style=”width: 150px”>&nbsp;&nbsp;

</select>

<select id=”skill_select” name=”category.cid” style=”width: 150px”>&nbsp;&nbsp;

</select>

</div>

<div class=”item1 update_pic” >
<span>摘要图片:</span>
<img src=”${pageContext.request.contextPath}/upload/<s:property value=”article_pic” />” id=”imageview” class=”item1_img” >
<label for=”fileupload” id=”label_file”>上传文件</label>
<input type=”file” name=”upload” id=”fileupload”/>
</div>

<div id=”editor” name=”article_content” style=”width:900px;height:400px;”></div>
<input type=”hidden” id=”resContent” value=”<s:property value=”article_content”/>”>
<input type=”hidden” name=”article_id” value=”<s:property value=”article_id”/>”>
<input type=”hidden” name=”article_pic” value=”<s:property value=”article_pic”/>”>
<button class=”am-btn am-btn-default” type=”button” id=”send” style=”margin-top: 10px;”>
修改</button>
</div>

</form>
2).服务器提供属性接收

3).上传文件处理

/**
* 文件上传提供的三个属性:
*/
@Setter
private String uploadFileName; // 文件名称
@Setter
private File upload; // 上传文件(文件路径)
@Setter
private String uploadContentType; // 文件类型
public String add() throws IOException {
System.out.println(“add-web层”);
//上传图片
if(upload != null){
//上传文件
//随机生成文件名称
//1.获取文件的扩展名
int index = uploadFileName.lastIndexOf(“.”);
String etx = uploadFileName.substring(index);
//2.随机生成文件名 拼接扩展名
String uuid = UUID.randomUUID().toString();/*生成的文件名是带“-”的,所以要去掉*/
String uuidFileName = uuid.replace(“-“, “”) + etx;
//确定上传的路径
String path = ServletActionContext.getServletContext().getRealPath(“/upload”);
File file = new File(path);
if(!file.exists()){
file.mkdirs();
}
//拼接新的文件路径
File desFile = new File(path + “/” + uuidFileName);
//文件上传
FileUtils.copyFile(upload,desFile);

//设置图片
article.setArticle_pic(uuidFileName);
}
//设置当前时间
article.setArticle_time(new Date().getTime());
System.out.println(article);
//调用业务层保存到数据库当中
articleService.save(article);
return “listres”;
}
3.集成富文本编辑器
umedit下载地址
https://ueditor.baidu.com/website/download.html
添加到页面添加
1).引入js
<script type=”text/javascript” charset=”utf-8″ src=”${ctx }/js/umedit/ueditor.config.js”></script>
<script type=”text/javascript” charset=”utf-8″ src=”${ctx }/js/umedit/ueditor.all.min.js”> </script>
<script type=”text/javascript” charset=”utf-8″ src=”${ctx }/js/umedit/lang/zh-cn/zh-cn.js”></script>
2).在页面当中提供div标签供显示内容
<div id=”editor” name=”article_content” style=”width:900px;height:400px;”></div>
3).在js当中初始化富文本编辑器
var ue = UE.getEditor(‘editor’);

4.富文本编辑器文件上传
1).添加uedit相关jar包

2).配置过滤器

package com.helong.web.filter;

import org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyFilter extends StrutsPrepareAndExecuteFilter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
//获取当前请求
HttpServletRequest request = (HttpServletRequest) req;
//获取请求的地址来进行判断
String requestURI = request.getRequestURI();
if(requestURI.contains(“js/umedit/jsp/controller.jsp”)){
//放行
chain.doFilter(req,res);
}else{
super.doFilter(req,res,chain);
}
}

}
3).json文件配置获取图片路径

/* 前后端通信相关的配置,注释只允许使用多行方式 */
{
/* 上传图片配置项 */
“imageActionName”: “uploadimage”, /* 执行上传图片的action名称 */
“imageFieldName”: “upfile”, /* 提交的图片表单名称 */
“imageMaxSize”: 2048000, /* 上传大小限制,单位B */
“imageAllowFiles”: [“.png”, “.jpg”, “.jpeg”, “.gif”, “.bmp”], /* 上传图片格式显示 */
“imageCompressEnable”: true, /* 是否压缩图片,默认是true */
“imageCompressBorder”: 1600, /* 图片压缩*长边限制 */
“imageInsertAlign”: “none”, /* 插入的图片浮动方式 */
“imageUrlPrefix”: “http://localhost:8080/”, /* 图片访问路径前缀 */
“imagePathFormat”: “/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}”, /* 上传保存路径,可以自定义保存路径和文件名格式 */
/* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */
/* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */
/* {time} 会替换成时间戳 */
/* {yyyy} 会替换成四位年份 */
/* {yy} 会替换成两位年份 */
/* {mm} 会替换成两位月份 */
/* {dd} 会替换成两位日期 */
/* {hh} 会替换成两位小时 */
/* {ii} 会替换成两位分钟 */
/* {ss} 会替换成两位秒 */
/* 非法字符 \ : * ? ” < > | */
/* 具请体看线上文档: fex.baidu.com/ueditor/#use-format_upload_filename */

/* 涂鸦图片上传配置项 */
“scrawlActionName”: “uploadscrawl”, /* 执行上传涂鸦的action名称 */
“scrawlFieldName”: “upfile”, /* 提交的图片表单名称 */
“scrawlPathFormat”: “/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}”, /* 上传保存路径,可以自定义保存路径和文件名格式 */
“scrawlMaxSize”: 2048000, /* 上传大小限制,单位B */
“scrawlUrlPrefix”: “”, /* 图片访问路径前缀 */
“scrawlInsertAlign”: “none”,

/* 截图工具上传 */
“snapscreenActionName”: “uploadimage”, /* 执行上传截图的action名称 */
“snapscreenPathFormat”: “/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}”, /* 上传保存路径,可以自定义保存路径和文件名格式 */
“snapscreenUrlPrefix”: “”, /* 图片访问路径前缀 */
“snapscreenInsertAlign”: “none”, /* 插入的图片浮动方式 */

/* 抓取远程图片配置 */
“catcherLocalDomain”: [“127.0.0.1”, “localhost”, “img.baidu.com”],
“catcherActionName”: “catchimage”, /* 执行抓取远程图片的action名称 */
“catcherFieldName”: “source”, /* 提交的图片列表表单名称 */
“catcherPathFormat”: “/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}”, /* 上传保存路径,可以自定义保存路径和文件名格式 */
“catcherUrlPrefix”: “”, /* 图片访问路径前缀 */
“catcherMaxSize”: 2048000, /* 上传大小限制,单位B */
“catcherAllowFiles”: [“.png”, “.jpg”, “.jpeg”, “.gif”, “.bmp”], /* 抓取图片格式显示 */

/* 上传视频配置 */
“videoActionName”: “uploadvideo”, /* 执行上传视频的action名称 */
“videoFieldName”: “upfile”, /* 提交的视频表单名称 */
“videoPathFormat”: “/ueditor/jsp/upload/video/{yyyy}{mm}{dd}/{time}{rand:6}”, /* 上传保存路径,可以自定义保存路径和文件名格式 */
“videoUrlPrefix”: “”, /* 视频访问路径前缀 */
“videoMaxSize”: 102400000, /* 上传大小限制,单位B,默认100MB */
“videoAllowFiles”: [
“.flv”, “.swf”, “.mkv”, “.avi”, “.rm”, “.rmvb”, “.mpeg”, “.mpg”,
“.ogg”, “.ogv”, “.mov”, “.wmv”, “.mp4”, “.webm”, “.mp3”, “.wav”, “.mid”], /* 上传视频格式显示 */

/* 上传文件配置 */
“fileActionName”: “uploadfile”, /* controller里,执行上传视频的action名称 */
“fileFieldName”: “upfile”, /* 提交的文件表单名称 */
“filePathFormat”: “/ueditor/jsp/upload/file/{yyyy}{mm}{dd}/{time}{rand:6}”, /* 上传保存路径,可以自定义保存路径和文件名格式 */
“fileUrlPrefix”: “”, /* 文件访问路径前缀 */
“fileMaxSize”: 51200000, /* 上传大小限制,单位B,默认50MB */
“fileAllowFiles”: [
“.png”, “.jpg”, “.jpeg”, “.gif”, “.bmp”,
“.flv”, “.swf”, “.mkv”, “.avi”, “.rm”, “.rmvb”, “.mpeg”, “.mpg”,
“.ogg”, “.ogv”, “.mov”, “.wmv”, “.mp4”, “.webm”, “.mp3”, “.wav”, “.mid”,
“.rar”, “.zip”, “.tar”, “.gz”, “.7z”, “.bz2”, “.cab”, “.iso”,
“.doc”, “.docx”, “.xls”, “.xlsx”, “.ppt”, “.pptx”, “.pdf”, “.txt”, “.md”, “.xml”
], /* 上传文件格式显示 */

/* 列出指定目录下的图片 */
“imageManagerActionName”: “listimage”, /* 执行图片管理的action名称 */
“imageManagerListPath”: “/ueditor/jsp/upload/image/”, /* 指定要列出图片的目录 */
“imageManagerListSize”: 20, /* 每次列出文件数量 */
“imageManagerUrlPrefix”: “”, /* 图片访问路径前缀 */
“imageManagerInsertAlign”: “none”, /* 插入的图片浮动方式 */
“imageManagerAllowFiles”: [“.png”, “.jpg”, “.jpeg”, “.gif”, “.bmp”], /* 列出的文件类型 */

/* 列出指定目录下的文件 */
“fileManagerActionName”: “listfile”, /* 执行文件管理的action名称 */
“fileManagerListPath”: “/ueditor/jsp/upload/file/”, /* 指定要列出文件的目录 */
“fileManagerUrlPrefix”: “”, /* 文件访问路径前缀 */
“fileManagerListSize”: 20, /* 每次列出文件数量 */
“fileManagerAllowFiles”: [
“.png”, “.jpg”, “.jpeg”, “.gif”, “.bmp”,
“.flv”, “.swf”, “.mkv”, “.avi”, “.rm”, “.rmvb”, “.mpeg”, “.mpg”,
“.ogg”, “.ogv”, “.mov”, “.wmv”, “.mp4”, “.webm”, “.mp3”, “.wav”, “.mid”,
“.rar”, “.zip”, “.tar”, “.gz”, “.7z”, “.bz2”, “.cab”, “.iso”,
“.doc”, “.docx”, “.xls”, “.xlsx”, “.ppt”, “.pptx”, “.pdf”, “.txt”, “.md”, “.xml”
] /* 列出的文件类型 */

 

上传文件到服务器例子,包括前端后台一整套

首先从前端开始:
uploadFile.jsp
<%@ page language=”java” contentType=”text/html; charset=UTF-8″
pageEncoding=”UTF-8″%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″>
<title>Insert title here</title>
</head>
<script src=”js/jquery-1.12.0.min.js”></script>
<script src=”js/jquery.form.js”></script>
<body>
<form id=”upfile”>
选择一个文件:
<input type=”file” name=”file” id=”upload” />
<br/><br/>
<input id=”uploadFile” value=”上传” type=”button”/>
</form>

<div id=”upFile”></div>
</body>
<script type=”text/javascript”>

$(“#uploadFile”).click(function(){
var formData = new FormData($(“#upfile”)[0]);
//formData.set(‘file’, document.getElementById(“upload”).files[0]);
$.ajax({
url: ‘${pageContext.request.contextPath}/uploadFile/upload’,
type: ‘POST’,
cache: false,
data: formData,
processData: false,
contentType: false
}).done(function(res) {

});
});
</script>
</html>
上面那个js中注掉的那行,是 直接定位到file那个标签,但是set方法在低版本的浏览器上不支持,会报错只供参考,注意file标签必须是在form里面,记得不能嵌套form,只能有一个form;一般form都是<form method=”post” action=”” enctype=”multipart/form-data” id=”upfile”></form>;我上面例子只是精简了;

前端完成后到后端:
先配置一些参数:
congif.properties(设置上传文件的大小和服务器地址):
#upload
upload.file.maxsize = 104857600
upload.file.url=http://192.168.102.11/test
pom.xml需要引入的jar包

<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-webdav-jackrabbit</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>slide</groupId>
<artifactId>slide-webdavlib</artifactId>
<version>2.1</version>
</dependency>

spring配置中需要加下面配置:
<!– 引入配置文件中的参数 –>
<context:property-placeholder location=”classpath:config.properties” />
<!– 配置MultipartResolver 用于文件上传 使用spring的CommosMultipartResolver –>
<bean id=”multipartResolver” class=”org.springframework.web.multipart.commons.CommonsMultipartResolver”>
<property name=”defaultEncoding” value=”UTF-8″></property>
<property name=”maxUploadSize” value=”50485760″></property>
<property name=”resolveLazily” value=”true”></property>
</bean>

<!– 对传入的url进行一些处理,这个<span style=”font-family: Arial, Helvetica, sans-serif;”>UploadFileUtils类所在路径需要根据你实际放置到项目的路径一致,这个类我下面提供了,建完这个类后别忘记把class中的路径替换掉</span>–>
<bean class=”com.yoho.common.UploadFileUtils”>
<property name=”downloadUrl” value=”${upload.file.url}”/>
</bean>
UploadFileUtils.java(这个类主要是对config中的url参数的一些处理)
import org.apache.commons.lang3.StringUtils;

public class UploadFileUtils {

public static String downloadUrl = null;

/**
* *对路径与相对路径转换
*/
public static String addPrefix(String url) {
// 本身就是*对路径直接返回
if (url == null || url.startsWith(“http://”) || url.startsWith(“https://”)) {
return url;
}
return URLUtils.append(downloadUrl, url);
}

public static String removePrefix(String url) {
// 如果 url 不符合条件,直接返回
if (url == null || !url.startsWith(downloadUrl)) {
return url;
}
return StringUtils.removeStart(url, downloadUrl);
}

public void setDownloadUrl(String downloadUrl) {
UploadFileUtils.downloadUrl = downloadUrl;
}
}
controller接收请求:
UploadFile.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.yoho.model.FileInfo;
import com.yoho.service.UploadService;

/**
* @author zelei.fan
*
*/
@Controller
@RequestMapping(“/uploadFile”)
public class UploadFile{

@Autowired
private UploadService uploadService;
/**
* 需要在spring-mvc中配置MultipartFile相关信息,以及引进fileUpload的依赖
* @param multipartFile
* @return
* @throws Exception
*/
@RequestMapping(value = “/upload”, method = RequestMethod.POST)
@ResponseBody
public FileInfo upload(@RequestParam(“file”)MultipartFile multipartFile)throws Exception{

FileInfo fileInfo = uploadService.uploadFile(multipartFile);
return fileInfo;
}

}
实体类,封装了一些属性,文件名,文件类型,相对地址,*对地址
FileInfo.java
public class FileInfo {

private String fileName;

private String fileType;

private String absoluteUrl;

private String relativeUrl;

private String fileSize;

private String fileMd5;

private String createAt;

public String getFileName() {
return fileName;
}

public void setFileName(String fileName) {
this.fileName = fileName;
}

public String getFileType() {
return fileType;
}

public void setFileType(String fileType) {
this.fileType = fileType;
}

public String getAbsoluteUrl() {
return absoluteUrl;
}

public void setAbsoluteUrl(String absoluteUrl) {
this.absoluteUrl = absoluteUrl;
}

public String getRelativeUrl() {
return relativeUrl;
}

public void setRelativeUrl(String relativeUrl) {
this.relativeUrl = relativeUrl;
}

public String getFileSize() {
return fileSize;
}

public void setFileSize(String fileSize) {
this.fileSize = fileSize;
}

public String getFileMd5() {
return fileMd5;
}

public void setFileMd5(String fileMd5) {
this.fileMd5 = fileMd5;
}

public String getCreateAt() {
return createAt;
}

public void setCreateAt(String createAt) {
this.createAt = createAt;
}

}

然后到service中进行业务处理:
UploadService.java(业务处理接口)
import org.springframework.web.multipart.MultipartFile;

import com.yoho.model.FileInfo;

public interface UploadService {

/**
* 上传文件,返回链接
* @param multipartFile
* @return
*/
FileInfo uploadFile(MultipartFile multipartFile);

}

具体的实现类:
UploadServiceImpl.java
import static com.google.common.base.Preconditions.checkArgument;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.StringTokenizer;
import org.apache.commons.httpclient.HttpURL;
import org.apache.webdav.lib.WebdavResource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
import com.google.common.collect.PeekingIterator;
import com.yoho.common.DateUtil;
import com.yoho.common.MD5;
import com.yoho.model.FileInfo;
import com.yoho.service.UploadService;

/**
*
* @author zelei.fan
*
*/
@Service
public class UploadServiceImpl implements UploadService{

@Value(“${upload.file.url}”)
private String uploadUrl;

@Value(“webdav”)
private String uploadUsername;

@Value(“webdav”)
public String uploadPassword;

@Override
public FileInfo uploadFile(MultipartFile multipartFile) {

//取到文件大小,如果超过指定范围的话就直接返回提醒错误
long size = multipartFile.getSize();
//获取文件名
String fileName = multipartFile.getOriginalFilename();
// 获取文件后缀,即文件类型
String fileExt = “”;
if (fileName.contains(“.”)) {
fileExt = fileName.substring(fileName.lastIndexOf(“.”) + 1).toLowerCase();
}
//设置MD5加密
String fileMD5 = md5File(multipartFile);

//拼接文件路径:/后缀/年/月/日/md5/filename
String saveUrl = “/” + fileExt + new SimpleDateFormat(“/yyyy/MM/dd/”).format(new Date()) + fileMD5 + “/” + multipartFile.getOriginalFilename();

String location = null;
try {
location = saveFile(multipartFile, saveUrl);//保存文件操作
} catch (Exception e) {
e.printStackTrace();
}

FileInfo fileInfo = new FileInfo();
fileInfo.setAbsoluteUrl(location);
fileInfo.setRelativeUrl(saveUrl);
fileInfo.setFileMd5(fileMD5);
fileInfo.setFileName(fileName);
fileInfo.setFileSize(String.valueOf(size));
fileInfo.setFileType(fileExt);
fileInfo.setCreateAt(DateUtil.date2String(new Date(), DateUtil.DATE_TIME_FORMAT));
return fileInfo;

}

//MD5加密
private String md5File(MultipartFile multipartFile) {
try {
return MD5.md5(multipartFile.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

private String saveFile(MultipartFile file, String savePath) throws Exception {
// 上传文件,到文件服务器,uploadUrl是在config中配好的,就是给uploadUrl赋值,如果不用那么麻烦的话可以直接把url放进去:upload(“http://192.168.102.11/test”, uploadUsername, uploadPassword, savePath, file.getBytes());
upload(uploadUrl, uploadUsername/*那台服务器的用户名*/, uploadPassword/*那台服务器的密码*/, savePath, file.getBytes());
return append(uploadUrl, savePath);

}

public static void upload(String webDavServer, String webDavUser, String webDavPassword, String remotePath, byte[] bytes) throws IOException {

if (!webDavServer.endsWith(“/”)) webDavServer += “/”;

//连接服务器
HttpURL hrl = new HttpURL(webDavServer);
hrl.setUserinfo(webDavUser, webDavPassword);

WebdavResource wdr = new WebdavResource(hrl);

//make directory if need
StringBuffer ssdir = new StringBuffer();
// 去除*后一个文件名
StringTokenizer t = new StringTokenizer(remotePath.substring(0, remotePath.lastIndexOf(“/”)), “/”);
while(t.hasMoreTokens()){
String sdir = t.nextToken();
ssdir.append(sdir+”/”);
wdr.mkcolMethod(wdr.getPath() + ssdir );
}

String remoteFile= wdr.getPath() + remotePath;//拼成*对地址
boolean result = wdr.putMethod(remoteFile, bytes);//把文件写进去
checkArgument(result, “文件上传出错”);//false时会报错,true则为成功

wdr.close();//*后关闭连接

}

/**
* 连接 URL
* @param paths
* @return
*/
public static String append(String… paths) {
List<String> pathList = Lists.newArrayList(paths);
PeekingIterator<String> iter = Iterators.peekingIterator(pathList.iterator());
StringBuilder urlBuilder = new StringBuilder();
while (iter.hasNext()) {
String current = iter.next();
urlBuilder.append(current);
if (!iter.hasNext()) {
break;
}
if (current.endsWith(“/”) && iter.peek().startsWith(“/”)) {
urlBuilder.deleteCharAt(urlBuilder.length() – 1);
} else if (!current.endsWith(“/”) && !iter.peek().startsWith(“/”)) {
urlBuilder.append(“/”);
}
}
return urlBuilder.toString();
}

}
所有的代码都已经在上面了,我已经测试过能上传成功,相应方法的注释页标在上面,希望你能运行成功;如果有什么问题可以留言给我,尽量能帮到你

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速