我有一些代码将字符串字节发送到服务器,然后在mvc c#中,我将这些字符串字节转换为原始字节,然后将这些字节保存到文件中。这很有效,但问题是,当我在HttpURLConnection中发送4个字符串字节的图像时,mvc服务器返回说文件未找到异常。
所以我发现,当我发送大图像时,它会失败,并出现此异常,而当我发送小于3080000字节的图像时,它会发送图像并将其保存到服务器。
因此,现在我决定向用户显示一条消息,显示一个关于文件限制的对话框,这样做好吗?
这是我的代码:
客户端
try {
if (imgS!=null && imgS.size()>0) {
for (int i = 0; i < imgS.size(); i++) {
if(i == 0){
image1 = Base64.encodeToString(imgS.get(i).bytes, Base64.DEFAULT);
}
if(i == 1){
image2 = Base64.encodeToString(imgS.get(i).bytes, Base64.DEFAULT);
}
if(i == 2){
image3 = Base64.encodeToString(imgS.get(i).bytes, Base64.DEFAULT);
}
if(i == 3){
image4 = Base64.encodeToString(imgS.get(i).bytes, Base64.DEFAULT);
}
}
}
if (!isDelivered) {
deliveredId = 2;
}
if (params[0] != null && (params[0].equals("0.00") || !params[0].equals(""))) {
priceTmp = Double.valueOf(params[0]);
}
if (params[6] != null && (params[6].equals("0.00") || !params[6].equals(""))) {
postageTmp = Double.valueOf(params[6]);
}
String responseText = "";
SharedPreferences preferences = getActivity().getSharedPreferences(PREFERENCE, Context.MODE_PRIVATE);
String json = String.format("{\"p_u_id\": \"%s\",\"price\": \"%.2f\"," +
"\"title\": \"%s\"" +
",\"description\": \"%s\",\"category\": \"%d\",\"tags\": \"%s\"" +
",\"image1\": \"%s\",\"image2\": \"%s\",\"image3\": \"%s\",\"image4\": \"%s\"" +
",\"postcode\": \"%s\",\"postage\": \"%.2f\",\"isDelivered\": \"%d\"}",
preferences.getString("userId", "0"),
priceTmp,
params[1],
params[2],
selectedCategory,
params[4],
image1,
image2,
"",
"",
params[5],
postageTmp,
deliveredId
);
long b = image1.getBytes().length + image2.getBytes().length +image3.getBytes().length + image4.getBytes().length;
if(b > 3080000){
return "FileLimit";
}else{
URL url = new URL("http://xxx/Home/xxxx");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(10000);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json"); // have tried without this
conn.setRequestProperty("Content-Length", json.getBytes().length + "");
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
os.write(json.getBytes("UTF-8"));
os.close();
conn.connect();
InputStream is = conn.getInputStream();
//here we read and print the response send by server; assuming that response type is text/html (MIME Type)
StringBuilder sb = new StringBuilder();
int ch;
//-1: end of stream
while ((ch = is.read()) != -1) {
sb.append((char) ch);
}
responseText = sb.toString();
conn.disconnect();
JSONObject obj = new JSONObject(responseText);
pid = obj.getInt("id");
serverImage1 = obj.getString("image1");
serverImage2 = obj.getString("image2");
json = String.format("{\"p_id\": \"%d\",\"image1\": \"%s\"," +
"\"image2\": \"%s\",\"p_u_id\": \"%s\"}",
pid,
image3,
image4,
preferences.getString("userId", "0")
);
url = new URL("http://xxx/Home/xxxx");
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(10000);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json"); // have tried without this
conn.setRequestProperty("Content-Length", json.getBytes().length + "");
conn.setDoOutput(true);
os = conn.getOutputStream();
os.write(json.getBytes("UTF-8"));
os.close();
conn.connect();
is = conn.getInputStream();
//here we read and print the response send by server; assuming that response type is text/html (MIME Type)
sb = new StringBuilder();
ch = 0;
//-1: end of stream
while ((ch = is.read()) != -1) {
sb.append((char) ch);
}
responseText = sb.toString();
return responseText;
}
} catch (Exception e) {
int i = 0;
}
我在这里所做的是将前两个图像发送到服务器,然后在发送前两个图像之后发送下两个图像。这很有趣,因为如果我发送两张大的图片,服务器会再次返回一个异常。
那么,向用户显示一条关于文件限制的消息是好的吗?
而像shpock和Ebay这样的其他应用程序在允许多个文件上传时又是如何工作的呢?
我试过使用一些Android库,但毫无悬念。
想知道一种发送四个文件的最大值的方法,而不显示用户的文件限制,只需直接发送4个图像。
MVC
if(image.Length > 0)
{
byte[] bytes = Convert.FromBase64String(image);
if (!System.IO.Directory.Exists(Server.MapPath("~/App_Data/products/" + uid)))
{
System.IO.Directory.CreateDirectory(Server.MapPath("~/App_Data/products/") + uid);
}
if (!System.IO.Directory.Exists(Server.MapPath("~/App_Data/products/" + uid + "/" + pid)))
{
System.IO.Directory.CreateDirectory(Server.MapPath("~/App_Data/products/") + uid + "/" + pid);
}
string path = Path.Combine(Server.MapPath("~/App_Data/products/" + uid + "/" + pid), guid + "" + ".jpg");
System.IO.File.WriteAllBytes(path, bytes);
}
发布于 2019-06-25 06:42:06
当你有了一个图像,你可以把它上传到一个云数据库,如Firestore或亚马逊S3,然后你发送链接而不是字节!
发布于 2019-06-25 09:02:31
向用户显示文件限制是个好主意吗?是的。
为什么3MB以上的图片不能使用?如果你看看微软的文档,你的Convert.FromBase64String方法会把数据放入一个无符号的8位整数数组中。一个无符号整数的最大值是429万,所以因为你使用了base64编码,所以你的图像实际上放大了33%,因为当你进行base64编码时,它的比例是4:3。
Convert.FromBase64String(String) Method
Base64 Padding file size increases
因此,您不能上传大于~3MB的任何内容。
其他公司如何做多文件上传?它们只是为每个文件异步调用相同的文件上传端点。因此,如果你发送4个文件,它将同时发出4个请求,这些请求将缓慢地上传图像(您通常可以看到每个文件单独的进度条指示器)。
https://stackoverflow.com/questions/56743736
复制相似问题