如何进入防止表单重复提交提交之后的断点?

F8:跳过后面所有断点,程序执行完
-debug时打的,程序远程完后就会消失
会话断点程序运行前通过会话断点按钮打的断点,在同一登录会话不同窗口都有效,用户注销后消失
外部断点-程序运行前通过外部断点按钮打的断点,用户注销后再登录还是有效,但只针对同一用户有效
'sapecc'."会在用户SAPECC运行程序时暂停
."所有的用户在运行程序时都会暂停
注:上面两个语句需要在程序代码里写死,是否开启调式需要修改代码,然后需要重传测试机与生产机,我们可以通过下面灵活的方式来实现:
调用& C160_BREAK_POINT
call function& 'C160_BREAK_POINT'.
然后在su01里对当前账户做如下设置:
这样这个账号 在运行加有上面函数的程序是 会断点进去。
这种方式只需要在su01里面将esp 这个参数值改成 不等于 &X& 那么该用户在运行程序的时候就不会有断点存在。
语句断点:在运行到设置的语句位置时会停下来
注:需要在ABAP调试模式已启动的情况下,才能进行语句断点的设置
子过程(Form)断点
Form断点:在运行到指定的Form位置时会停下来
注:需要在ABAP调试模式已启动的情况下,才能进行语句断点的设置
函数断点:在运行到指定的函数时会停下来
注:需要在ABAP调试模式已启动的情况下,才能进行语句断点的设置
类方法断点
运行时会在指定类的方法中停下来
运行时抛出异常时会停下来
基于类异常与老式异常都可以
抛出某种消息时会停下来
当满足一定条件时,程序暂停,并跳转到相应代码行:
如果你对字段MATNR设置观察点(条件matnr = '1234'),&那么程序流将会在字段MATNR改变并且值等于'1234'的时候停止。
如果在设置观察点时没有设定条件,那么只要字段MATNR的值改变时,程序流将会停止:
断点(包括条件断点)的管理可以在&Break-Watchpoints&布局视图中查看:
&命令启动调试
在程序(或事务码)执行前,在SAP工具栏命令行中输入&/H&(实质上输入的是OK-Code),执行程序后将自动进入调试状态,这对于调试SAP系统程序的有很大的帮助
输入&/h&回车后,再输入事务码,如SM30,则会进自调试模式:
通过&/H&命令文本方式启动调试
直接输入&/H&的方法要求必须是在命令输入框可输入状态时才能使用,若遇到对话框屏幕时,是无法输入&/H&命令的,此时可能通过创建好的&/H&快捷方式来启动调试。
如下图所示红色框中的预览按扭,如果你希望在点击这个按扭的时候进入debug模式,此时弹对话框是模式窗口,命令行不能继续僌,如现在要进行调试,你该怎么做呢?
新创建一个文本文件,并在文件中输入如下内容:
Command=/H
Type=SystemCommand
使用本文档很简单,将本文件拖动到窗口中松手,并再执行你想要的操作,这样就会进入调试模式了。
阅读(...) 评论()最近项目中有使用到文件断点上传,得空便总结总结,顺便记录一下,毕竟“好记性不如烂笔头”。
后端代码:
package com.test.
import java.io.BufferedOutputS
import java.io.F
import java.io.FileOutputS
import java.util.UUID;
import org.apache.commons.io.FileU
import org.apache.commons.io.FilenameU
import org.springframework.stereotype.C
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.RequestP
import org.springframework.web.bind.annotation.ResponseB
import org.springframework.web.multipart.MultipartF
@Controller
public class UploadController {
@ResponseBody // 返回rest json
@RequestMapping(value = {"/rest/saveUploadFileAsChunk"}, method = RequestMethod.POST, produces = "application/json")
public File saveUploadFileAsChunk(@RequestParam(required = false) MultipartFile file,
@RequestParam(required = true) Integer chunk,
// 分割块数
@RequestParam(required = true) Integer chunks,
// 总分割数
@RequestParam(required = true) String tempFileName //临时文件名
必须带后缀名
) throws Exception{
if(null != file){
// 保存临时文件
String chunkName = tempFileN
if (chunk != null) {
chunkName = chunk + "_" + tempFileN
File savedFile = new File("普通存放文件的路径", chunkName);
if (!savedFile.getParentFile().exists())
savedFile.getParentFile().mkdirs();
file.transferTo(savedFile);
//将MultipartFile转存到file对象
//如果到最后一个分割块,则做合并处理
if (chunk != null && chunk + 1 == chunks) {
String newFileName = UUID.randomUUID().toString().replace("-", "").concat(".").concat(FilenameUtils.getExtension(tempFileName));
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(new File("普通存放文件的路径", newFileName)));
// 遍历文件合并
chunks,循环将文件写入新的文件中,并且删除之前的临时文件
for (int i = 0; i & i++) {
File tempFile = new File("普通存放文件的路径", i + "_" + tempFileName);
byte[] bytes = FileUtils.readFileToByteArray(tempFile);
//将file对象解析城byte数组
outputStream.write(bytes);
outputStream.flush();
tempFile.delete();
outputStream.flush();
outputStream.close();
File reallyFile = new File("普通存放文件的路径", newFileName);
//reallyFile即最后合并的文件
return reallyF
  前端代码:&
var setsize = 10 * 1024;
//1024字节 = 1KB * 10
*参数filepath就是本地文件路径,主要就是用于放在localStorage中确定唯一性
file : js的Blob对象
function uplaod(filepath,file){
var filesize = file.
var filecount = filesize/
//计算出可以分成几块
var i = localStorage.getItem(filepath);
i = (i!=null && i!="")?parseInt(i):0;
if(i & filecount){
//新建一个FormData对象
var formData = new FormData(); //++++++++++
if((filesize - i * setsize) & setsize){
blobfile = file.slice(i*setsize,(i+1)*setsize);
//代表是最后一此了
blobfile = file.slice(i*setsize,filesize);
formData.append('chunk', i); //++++++++++当前文件块
formData.append('chunks', Math.ceil(filecount)); //++++++++++
formData.append("tempFileName",fileName);
//临时文件名 带uuid的
formData.append('file', blobfile);
if(i & filecount){
url: PATROL_CONSTANTS.SRV_URL+"/rest/saveUploadFileAsChunk",
type: 'POST',
data: formData,
processData: false,
contentType: false,
success: function (responseStr) {
localStorage.setItem(filepath,i+1);
var rs = filecount &= 0 ? "0%" : (Math.round((i+1) / Math.ceil(filecount) * 10000) / 100.00 + "%");
console.log("进度百分比:"+rs);
uploadFile(filepath,file);
//递归调用
error: function (responseStr) {
console.log("上传失败,重复尝试!");
console.log(responseStr);
uploadFile(filepath,file);
//上传完成后,则将对应的localStorage移除掉
localStorage.removeItem(filepath);
转发请标注原文地址:
  阿杰de博客,qq群:
阅读(...) 评论()标题:为什么要在Adodc1.Recordset.Update 行设置断点,才能立即更新库表?请高手帮忙.谢.
在form1中有ADODC1与MSHFLEXGRID1绑定,还有COMMAND1(“删除记录”,调用form2)
在form2中有TEXT1,command2,还有ADODC1,与form1中的ADODC1同源,并与TEXT1绑定.
想要实现的功能:
1.在form1中点击command1,出现form2
2.在form2中的text1中输入要删除的记录的字段值,并找到该记录,删除它.
3.删除后立即更新库表,并把删除结果体现在form1的MSHFlexGrid1中.
存在的问题:
1.单击form2的command2后,form1中的mshflexgrid1无反应.但退程序后,发现库表确已删除.
2.若在Adodc1.Recordset.Update 行设置断点,以上问题解决..
3.请求各位专家高手帮忙.
4.万分感激
部分代码如下:
Private Sub Form_Load()
Adodc1.Recordset.Sort = "[期号] DESC"
Adodc1.Recordset.MoveFirst
Text1.Text = Val(Adodc1.Recordset.Fields("期号")) ‘默认删除第一条记录
Private Sub command2_click()
Adodc1.Recordset.Find "[期号]=" & Text1.Text
If Adodc1.Recordset.EOF = False Then '若有该字段值的记录存在
Adodc1.Recordset.Delete
Adodc1.Recordset.MoveFirst
Adodc1.Recordset.Update '断点设置处.
Adodc1.Refresh
Adodc1.Recordset.Sort = "[期号] DESC"
'///////////////////后又加入以下五行代码仍然不行.
‘///////////////////但在另一个recordset.addnew过程中加入,则问题解决.
Form1.Adodc1.Recordset.Update
Form1.Adodc1.Refresh
Form1.Adodc1.Recordset.Sort = "[期号] desc"
Form1.Adodc1.Recordset.MoveFirst
Form1.MSHFlexGrid1.SetFocus
Form1.MSHFlexGrid1.Refresh
'//////////////////////////////////////////////////////
只向ADODB.Recordset写数据,不更新数据库
Option Explicit
Dim Rs As New ADODB.Recordset
'比如给第3列增加内容3
Private Sub Command1_Click()
VB6.0用recordset对数据库进行的更新操作
Dim num As IntegerDim sql As StringDim cn As ADODB.ConnectionDim rs As ADODB.RecordsetDim com As ADO...
最近做一个有数据库编程的项目,使用了CRecordset类。总结下心得,方便自己,方便后学的人。
在中介绍了有关CRecordset类的具体用法。那么有以下两个
如何实现将vsflexgrid中修改的数据反馈到数据库中?
Private Sub vsflexgrid1_AfterEdit(ByVal Row As Long, ByVal Col As Lon...
转自SOHU博客VB菜鸟堂
Set Rs = Server.CreateObject(&ADODB.Recordset&)
Rs.Open Source, ActiveConnection, CursorType, LockT...
没有更多推荐了,每当我们想简单的实现文件上传功能,而又不使用其他的语言(比如PHP、Java),或者想实现文件的断点续传。这个时候Nginx的一个模块nginx-upload-module就能满足我们的需求。
下载模块:
wget https://codeload.github.com/vkholodkov/nginx-upload-module/zip/2.2
安装模块:
.configure --add-module=/tmp/nginx-upload-module-2.2/
multipart/form-data表单上传示例
nginx.conf配置:
location /upload {
upload_pass @uploadH
upload_store /usr/local/nginx/upload_temp 1;
upload_set_form_field $upload_field_name.path "$upload_tmp_path";
location @uploadHandler {
proxy_pass http://backend-
这里在server里定义了upload location,这个location是上传的接口,还有@uploadHandler location,是当文件上传完成后,nginx模块会对这个location发送一些必要的信息,如文件上传的路径,这里涉及了几个指令:
upload_pass @uploadHandler:上传完成后会发送必要的数据到@uploadH
upload_store /usr/local/nginx/upload_temp 1: 文件上传的临时目录;
upload_set_form_field $upload_field_name.path &$upload_tmp_path&: 设置文件上传完成后,把文件临时路径发送给upload_pass指定的location。
断点续传示例
nginx.conf配置
location /resumable_upload {
upload_state_store /usr/local/nginx/upload_
upload_pass @drivers_upload_
upload_store /usr/local/nginx/upload_
upload_set_form_field $upload_field_name.path "$upload_tmp_path";
location @resumable_upload_handler {
proxy_pass http://localhost:8002;
与上一步multipart/form-data表单上传示例配置不同的地方有:
upload_resumable on: 开启断点续传功能;
upload_state_store /usr/local/nginx/upload_temp: 设置断点续传状态文件存储的目录。
上传文件第一个片段
POST /upload HTTP/1.1
Host: example.com
Content-Length: 51201
Content-Type: application/octet-stream
Content-Disposition: filename="big.TXT"
X-Content-Range: bytes 0-
Session-ID:
&0-51200的字节文件数据&
上传文件第一个片段服务器响应
HTTP/1.1 201 Created
Date: Thu, 02 Sep :40 GMT
Content-Length: 14
Connection: close
上传文件最后一个片段
POST /upload HTTP/1.1
Host: example.com
Content-Length: 51111
Content-Type: application/octet-stream
Content-Disposition: filename="big.TXT"
X-Content-Range: bytes 919/511920
Session-ID:
&919字节文件数据&
上传文件最后一个片段服务器响应
HTTP/1.1 200 OK
Date: Thu, 02 Sep :43 GMT
Content-Type: text/html
Connection: close
Content-Length: 2270
& 响应的内容&
请求头说明
Content-Disposition
attachment, filename=&上传的文件名&
Content-Type
待上传文件的mime type,如application/octet-stream(注:不能为multipart/form-data)
X-Content-Range
待上传文件字节范围,如第一片段bytes 0-,最后一个片段bytes 919/511920(注:文件第一个字节标号为0,最后一个字节标号为n-1,其中n为文件字节大小)
X-Session-ID
上传文件的标识,由客户端随机指定.因为是断点续传,客户端必须确保同一个文件的所有片段上传标识一致
Content-Length
上传片段的大小
Python上传demo
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os.path
import requests
import hashlib
# 待上传文件路径
FILE_UPLOAD = "/tmp/testfile"
# 上传接口地址
UPLOAD_URL = "http://host/drivers_upload"
# 单个片段上传的字节数
SEGMENT_SIZE = 1048576
def upload(fp, file_pos, size, file_size):
session_id = get_session_id()
fp.seek(file_pos)
payload = fp.read(size)
content_range = "bytes {file_pos}-{pos_end}/{file_size}".format(file_pos=file_pos,
pos_end=file_pos+size-1,file_size=file_size)
headers = {'Content-Disposition': ' filename="big.TXT"','Content-Type': 'application/octet-stream',
'X-Content-Range':content_range,'Session-ID': session_id,'Content-Length': size}
res = requests.post(UPLOAD_URL, data=payload, headers=headers)
print(res.text)
# 根据文件名hash获得session id
def get_session_id():
m = hashlib.md5()
file_name = os.path.basename(FILE_UPLOAD)
m.update(file_name)
return m.hexdigest()
def main():
file_pos = 0
file_size = os.path.getsize(FILE_UPLOAD)
fp = open(FILE_UPLOAD,"r")
while True:
if file_pos + SEGMENT_SIZE &= file_size:
upload(fp, file_pos, file_size - file_pos, file_size)
fp.close()
upload(fp, file_pos, SEGMENT_SIZE, file_size)
file_pos = file_pos + SEGMENT_SIZE
if __name__ == "__main__":
阅读(...) 评论()需求是模拟form表单,通过HTTP流上传文件到服务器,前面找了好多资料,很多是有jar包的,要不就是太复杂,或者过时的,不生效的。最后找了一个比较清晰的,但是这个也不完整,有错误。通过不断的了解,最终理解了实现的原理,并作出修改。
最初这个方法是通过servlet实现的,但现在都是用的springMVC 的Controller,内部代码也缺少一些配置。最终修改成下面这样。
//上传文件
private String upload(File file){
String uploadFile = file.getAbsolutePath();//读取当前文件绝对路径
String[] strs=uploadFile.split(FinalCode.IV);// 构建源文件
String newName =strs[1].substring(1);//获取相对文件路径
String fname=newName.substring(0,newName.lastIndexOf('\\')+1);//获取文件名
//上面是获取文件名,有些可以不需要
StringBuffer b = new StringBuffer();//创建Controller执行完上传返回的String
String end = "\r\n";//上传模拟http
String twoHyphens = "--";
String boundary = "*****";
String actionUrl = "http://127.0.0.1:8080/uploadServlet";//构建请求的Controller
URL url = new URL(actionUrl);//构建URL
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoInput(true);//允许Input、Output,不使用Cache
con.setDoOutput(true);
con.setUseCaches(false);
con.setRequestMethod("POST");//设置传送的method=POST
con.setRequestProperty("Connection", "Keep-Alive");//setRequestProperty
con.setRequestProperty("Charset", "UTF-8");//设置编码格式
con.setRequestProperty("Content-Type", "multipart/form-boundary=" + boundary);//设置是form请求
DataOutputStream ds = new DataOutputStream(con.getOutputStream());//设置DataOutputStream
ds.writeBytes(twoHyphens + boundary + end);//设置结束标记
ds.writeBytes("Content-Disposition: form- " + "name=\"file1\";filename=\"" + newName + "\"" + end);
ds.writeBytes(end);//写入结束标记
FileInputStream fStream = new FileInputStream(uploadFile);//取得文件的FileInputStream
int bufferSize = ;//设置每次写入500kb
byte[] buffer = new byte[bufferSize];
int length = -1;
while ((length = fStream.read(buffer)) != -1) {//从文件读取数据至缓冲区
ds.write(buffer, 0, length);//将资料写入DataOutputStream中
ds.writeBytes(end);
ds.writeBytes(twoHyphens + boundary + twoHyphens + end);
fStream.close();//close streams
ds.flush();
InputStream is = con.getInputStream();//以流的方式取得Response返回的内容
while ((ch = is.read()) != -1) {
b.append((char) ch);
ds.close();//关闭DataOutputStream
} catch (Exception e) {
System.out.println(("上传成功"));
return b.toString();
然后就是名为uploadServlet的Controller,它是在InputStream is = con.getInputStream();//以流的方式取得Response返回的内容
时会去请求这个Controller。
@RequestMapping("/uploadServlet")
@ResponseBody
public String uploadServlet(HttpServletRequest request) {
String savePath="";//设置文件在服务器绝对路径
System.out.println("IP:" + request.getRemoteAddr());//监测IP
DiskFileItemFactory facotry = new DiskFileItemFactory();// 1、创建工厂类:DiskFileItemFactory
String tempDir = servletContext.getRealPath("/WEB-INF/temp");
facotry.setSizeThreshold(10*);//设置内存为10M,小于10M才能上传(最初没有,造成只能上传10kb)
facotry.setRepository(new File(tempDir));//设置临时文件存放目录
ServletFileUpload upload = new ServletFileUpload(facotry);// 2、创建核心解析类:ServletFileUpload
upload.setHeaderEncoding("UTF-8");// 解决上传的文件名乱码
upload.setFileSizeMax(1024 * 1024 * 10);// 单个文件上传最大值是10M
upload.setSizeMax(1024 * 1024 * 80);//文件上传的总大小限制80M
boolean bb = upload.isMultipartContent(request);// 3、判断用户的表单提交方式是不是multipart/form-data
List&FileItem& items = upload.parseRequest(request);// 4、是:解析request对象的正文内容List&FileItem&
String storePath = servletContext.getRealPath("/WEB-INF/upload");// 上传的文件的存放目录
for (FileItem item : items) {
if (item.isFormField()) { // 5、判断是否是普通表单:打印看看
String fieldName = item.getFieldName();// 请求参数名
String fieldValue = item.getString("UTF-8");// 请求参数值
System.out.println(fieldName + "=" + fieldValue);
} else {// 6、上传表单:得到输入流,处理上传:保存到服务器的某个目录中,保存时的文件名是啥?
String fileName = item.getName();// 得到上传文件的名称
// C:\Documents
and Settings\shc\桌面\a.txt
//解决用户没有选择文件上传的情况
if(fileName==null||fileName.trim().equals(""))
//这里删除了获取文件夹,下面需要判断的
InputStream in = item.getInputStream();//获取当前文件的流
//这里删除了验证是否存在同类型文件,每个人的功能不一样,所以你们不需要
//这个savePath就是在Tomcat下的绝对路径了,就是storePath(这个是服务器的地址)+(前面获取的文件夹+文件名)反正你们根据需求去获取
OutputStream out = new FileOutputStream(savePath);
byte b[] = new byte[];
int len = -1;
while ((len = in.read(b)) != -1) {
out.write(b, 0, len);
in.close();
out.close();
item.delete();//删除临时文件
}catch(FileUploadBase.FileSizeLimitExceededException e){
e.printStackTrace();
request.setAttribute("message", "单个文件大小不能超出10M");
}catch(FileUploadBase.SizeLimitExceededException e){
e.printStackTrace();
request.setAttribute("message", "总文件大小不能超出50M");
}catch (Exception e) {
e.printStackTrace();
request.setAttribute("message", "上传失败");
return saveP
我传入的是文件夹,上传上去的也是同一结构,而且我还加了一些验证,修改文件名的功能。
现有上传逻辑为:表单上传文件到服务器本地存储路径,支持断点续传,由服务器文件再转发至oss。
本博客上传逻辑为:表单上传接收到文件流,将文件流直接上传至oss。2.实现
示例1:表单里有图片/文件的上传multipart/form-data 是上传二进制数据
form里面的input的值以2进制的方式传过去,所以这里要明白,使用这种格式以后,后台request就获取...
前几天我基于plupload改写的文件上传的空间
fileinput.js是bootstrap下面的一款样式简洁且功能强大的文件上传的插件.
fileinput.js需要再页面加载时完成初始化,虽然可以通过 uploadExtraDa...
这里用到HTML
标签的 enctype 属性。
enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。
默认地,表单数据会编码为 “application/x-www...
图片上传HttpUploadFile
post有两种上传方式,这里只列举上传附件的方式(这种请求方式支持文件或文件&普通参数或普通参数)即:
Content-Type = multipart/form-
该种类型有固定的参数...
废话不多说,直接奔主题
大家都知道,当form表单中既要提交文本,又要上传图片时,必需在form表单中加上属性enctype =&multipart/form-data&,但一加上这个属性,用req...
Multipart/form-data POST文件上传详解
简单的HTTP POST
大家通过HTTP向服务器发送POST请求提交数据,都是通过form表单提交的,代码如下:
#include&cgic.h&
//author pdfccc@sina...
没有更多推荐了,}

我要回帖

更多关于 button提交表单 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信